是否可以不处理C#方法的返回值?在这个例子中什么是好的做法?

出于好奇…当我们调用一个方法返回一些值,但我们不处理/使用它会发生什么?我们也期望有时这个返回值可能真的很大。这个值是什么?是甚至创建?如果是,是否有任何性能问题或可能发生的其他问题? (这种情况下的最佳做法是什么?)

让我们假设我们有一些方法做一些数据库操作(插入,更新),并返回DataTable对象中的一些数据。我也知道这个DataTable对象可能真的很大有时:

public static Datatable InsertIntoDB(...) 
{
      // executing db command, getting values, creating & returning Datatable object...
      ...
      return myDataTable;
}

然后当使用这个方法时,它被称为像这样:

DataTable myDataTable = InsertIntoDB(...);
// this Datatable object is handled in some way

但有时只是这样:

InsertIntoDB(...);
// returned value not handled; Problem???

在我的第一个想法,它认为系统是聪明的,看到返回的值被忽略,不会导致任何问题(它是简单的发布),但我想确定,并听到更多的详细解释从一个更有经验的人这个区域比我。

返回的值(或引用,如果它是引用类型)被推入堆栈,然后再次弹出。

没有大的。

如果返回值不相关,您可以安全地执行此操作。

但确保它是不相关的,以防万一。

这里有一些代码:

    static string GetSomething()
    {
        return "Hello";
    }

    static void Method1()
    {
        string result = GetSomething();
    }

    static void Method2()
    {
        GetSomething();
    }

如果我们看看IL:

方法1:

.locals init ([0] string result)
IL_0000:  nop
IL_0001:  call       string ConsoleApplication3.Program::GetSomething()
IL_0006:  stloc.0
IL_0007:  ret

方法2:

IL_0000:  nop
IL_0001:  call       string ConsoleApplication3.Program::GetSomething()
IL_0006:  pop
IL_0007:  ret

完全相同的指令数。在Method1中,值存储在本地字符串result(stloc.0)中,当超出范围时将被删除。在Method2中,pop操作只是从堆栈中删除它。

在你返回“真正大”的情况下,该数据已经创建并且该方法返回一个对它的引用;不是数据本身。在Method1()中,引用被分配给局部变量,并且垃圾回收器将在变量超出范围(在这种情况下为方法的结尾)之后对其进行整理。在Method2()中,垃圾收集器可以在引用从堆栈弹出后的任何时间工作。

通过忽略返回值,如果它真的不需要,垃圾收集器可能会更快地工作,释放任何已分配的内存。但是有很少(在这种情况下),但是使用长时间运行的方法,挂在数据可能是一个问题。

但是远离最重要的是确保你忽略的返回值不是你应该采取的行为。

翻译自:https://stackoverflow.com/questions/6874855/is-it-ok-not-to-handle-returned-value-of-a-c-sharp-method-what-is-good-practice

转载注明原文:是否可以不处理C#方法的返回值?在这个例子中什么是好的做法?