if(new string[] {constants.username,Constants.Lowercase}.contains("test"))
代码会创建一个对象吗?请帮助它会为下面的代码创建一个对象吗?
if(new string[] {constants.username,Constants.Lowercase}.contains("test"))
代码会创建一个对象吗?请帮助它会为下面的代码创建一个对象吗?
是的,每次都会创建一个新的字符串数组。
选项:
如果他们实际上是常数:switch
:
switch(value) {
case Constants.UserName:
case Constants.LowerCase:
// ...
break;
}
如果他们是 “不变,但不const
”,那么也许的string[]
/HashSet<string>
一个static readonly
例如在静态构造函数初始化(或者他们没有改变的范围)。
是的,你将创建一个字符串数组的一个实例
,如果你想看看有什么掩护下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
关键字“新”总是表示正在创建一个对象。在这种情况下,该对象仅在if语句中有效。声明之后,对象将被垃圾收集器释放并清理。
“关键字”new“总是表示正在创建一个对象” - 不是没有; '新的DateTime(2017,7,17)' - 零对象。 –
我很确定新的DateTime(..)将用指定的参数创建DateTime的新对象。新的可用于:1)操作符2)修饰符3)限制器 – Xzibitee
'DateTime' *不是对象*,至少在分配意义上不是。它可以通过拳击*制成一个物体,但这不同 –
它每次都会创建一个新的数组,是的。但是,如果它们实际上是常量......那么在这里测试什么呢? –
你为什么关心这个小阵列?代码是可读和可维护的。我会在'if'语句之前声明数组,然后给它一个有意义的名称。 –
@TimSchmelter我将不得不在那里介入;小对象的分配*做*很重要,非常非常... *如果它处于热代码路径中。如果这是在一个按钮上单击UI ...没有那么多。但是:分配从来都不是免费的。 –