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

时间:2017-07-17 08:07:50

标签: c#

if(new string[] {constants.username,Constants.Lowercase}.contains("test"))

代码是否会创建一个对象?请帮忙

3 个答案:

答案 0 :(得分:0)

是的,您将创建一个字符串数组的实例 如果你想看看封面下有什么问题

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

由此生成的IL将如下所示

 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

答案 1 :(得分:0)

关键字“new”始终表示正在创建对象。在这种情况下,该对象仅在if语句中有效。在语句之后,对象将被垃圾收集器释放和清理。

答案 2 :(得分:0)

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

选项:

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

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

如果它们不变,但不是const",则可能在静态构造函数中初始化static readonly / string[]的{​​{1}}个实例(或者他们不改变的范围。