2017-07-17 61 views
0
if(new string[] {constants.username,Constants.Lowercase}.contains("test")) 

代码会创建一个对象吗?请帮助它会为下面的代码创建一个对象吗?

+0

它每次都会创建一个新的数组,是的。但是,如果它们实际上是常量......那么在这里测试什么呢? –

+0

你为什么关心这个小阵列?代码是可读和可维护的。我会在'if'语句之前声明数组,然后给它一个有意义的名称。 –

+0

@TimSchmelter我将不得不在那里介入;小对象的分配*做*很重要,非常非常... *如果它处于热代码路径中。如果这是在一个按钮上单击UI ...没有那么多。但是:分配从来都不是免费的。 –

回答

0

是的,每次都会创建一个新的字符串数组。

选项:

如果他们实际上是常数:switch

switch(value) { 
    case Constants.UserName: 
    case Constants.LowerCase: 
     // ... 
     break; 
} 

如果他们是 “不变,但不const”,那么也许的string[]/HashSet<string>一个static readonly例如在静态构造函数初始化(或者他们没有改变的范围)。

0

是的,你将创建一个字符串数组的一个实例
,如果你想看看有什么掩护下hapening

if (new string[] { "a", "b" }.Contains("c")) ; 

的IL从这个生成看起来像follwing

IL_0001: ldc.i4.2  
    IL_0002: newarr  [mscorlib]System.String 
    IL_0007: dup   
    IL_0008: ldc.i4.0  
    IL_0009: ldstr  "a" 
    IL_000e: stelem.ref 
    IL_000f: dup   
    IL_0010: ldc.i4.1  
    IL_0011: ldstr  "b" 
    IL_0016: stelem.ref 
    IL_0017: ldstr  "c" 

newarr是负责创建新对象的IL指令
看一看OpCodes.Newarr

0

关键字“新”总是表示正在创建一个对象。在这种情况下,该对象仅在if语句中有效。声明之后,对象将被垃圾收集器释放并清理。

+0

“关键字”new“总是表示正在创建一个对象” - 不是没有; '新的DateTime(2017,7,17)' - 零对象。 –

+0

我很确定新的DateTime(..)将用指定的参数创建DateTime的新对象。新的可用于:1)操作符2)修饰符3)限制器 – Xzibitee

+0

'DateTime' *不是对象*,至少在分配意义上不是。它可以通过拳击*制成一个物体,但这不同 –

相关问题