Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在if语句条件中使用新运算符是个坏主意吗?_C# - Fatal编程技术网

C# 在if语句条件中使用新运算符是个坏主意吗?

C# 在if语句条件中使用新运算符是个坏主意吗?,c#,C#,对于上面的代码段,someList是一个结构列表,listItem是结构 在此上下文中使用新运算符是否会导致内存泄漏?或者这是一个普遍的坏习惯的例子?我在SO和Google上搜索过,但没有找到一个专门解决这个问题的问题。这是一个可读性问题。当我像你所说的那样做时,我发现阅读起来更难。我更喜欢一份单独的清单声明 性能或内存泄漏方面没有差异 另外,当您单独声明列表时,您可以为列表指定一个有意义的名称 例如,var listOfDays=new List…..这不是内存泄漏,我也不需要称之为坏样式(它

对于上面的代码段,
someList
是一个结构列表,
listItem
是结构


在此上下文中使用新运算符是否会导致内存泄漏?或者这是一个普遍的坏习惯的例子?我在SO和Google上搜索过,但没有找到一个专门解决这个问题的问题。

这是一个可读性问题。当我像你所说的那样做时,我发现阅读起来更难。我更喜欢一份单独的清单声明

性能或内存泄漏方面没有差异

另外,当您单独声明列表时,您可以为列表指定一个有意义的名称


例如,var listOfDays=new List…..

这不是内存泄漏,我也不需要称之为坏样式(它在MSDN中使用)

但我可能不会这么做——我会做一些类似的事情:

if (!someList.Contains(new listItem(arg1, args2)))
{
    // Do some stuff
}

要在C#中创建内存泄漏,您必须非常努力。这是可能的,但意外发生的情况并不多(与其他没有如此直接内存管理的语言交互时除外)。不过,我不会在这里讨论边缘案例

以下是该对象的内存外观:

  • 局部变量将在保存所显示代码的任何方法中创建。由于没有显式地将新结构设置为局部变量,因此它将具有一些代码中无法引用的名称
  • 它将通过堆栈传递给您调用的方法。(它将通过值传递,因此此时将有两个具有相同结构的变量)
  • Contains
    返回时,它的调用堆栈上的参数将被“释放”,因此我们现在回到只有一个变量的状态
  • 当您当前使用的方法完成时(或者可能稍早一点,如果编译器想在知道不再使用它的情况下对其进行优化),结构的堆栈空间将被“释放”
即使使用了
new
关键字,也不会在堆上创建结构。它仍然是在堆栈上创建的。在C#
中,显式调用任何构造函数(禁止反射)时使用new
,并且不指示堆上的分配(例如,在C++中的方式)


还值得一提的是,即使这是一个类,而不是一个结构,也不会导致任何内存泄漏。该对象最终将位于堆上,但垃圾收集器将在不再需要它之后的某个时间点对其进行清理。你在这里做的任何事情都不会导致在不需要时保留对对象的引用(我知道
Contains
不会做任何会阻止它被收集的恶作剧;如果它是某个未知函数,它们可能会做一些有意义的事情,但不太可能).

与结构有关的情况并不少见。例如,在使用
DateTime
s时,可以说:

if (!someList.Any(o => o.Arg1 == arg1 && o.Arg2 == arg2)) 
{ 
    // Do some stuff 
} 


除非您实现
Equals()
,否则这是行不通的。@SLaks代码实际上是行不通的,但为什么您会期望它不起作用呢?@Keplah如他所说:default object.Equals永远不会起作用match@SLaks而且@sehe它将起作用,因为
listItem
是一个
struct
(OP中的文本)啊。愚蠢的疏忽。对不起:)是的,代码只是我在飞行中想出的。对于一个应用程序来说,它没有得到认真的实现。我怀疑这种方法的效率会低于OP的方法。它也更难阅读。你为什么要这样做?
if (fooDate == new DateTime(2000, 1, 30, 11, 30, 0))
if (fooDate.Year = 2000 && fooDate.Month = 1 && fooDate.Day = 30 && ...)