【问题标题】:C# - Is this declared string treated as a const?C# - 这个声明的字符串是否被视为常量?
【发布时间】:2009-02-10 11:44:33
【问题描述】:

在这里帮我解决一个争论。

这是:

SqlCommand cmd = new SqlCommand( "sql cmd", conn);

与此完全相同:

const string s = "sql cmd";
SqlCommand cmd = new SqlCommand( s, conn);

即。如果我明确指出字符串 s 是一个 const 会有什么不同吗?

而且,如果不以同样的方式对待它,为什么不呢?

【问题讨论】:

  • 你为什么把它做成一个社区维基?
  • 这是个错误 - 我不知道 CW 是什么。

标签: c# clr constants readonly


【解决方案1】:

在后面的 sn-p 中,不是 string 是 const 而是 variable 是 const。这与 C++ 中的 const 不太一样。 (字符串在 .NET 中始终不可变。)

是的,两个 sn-ps 做同样的事情。唯一的区别是,在第一种形式中,您还将拥有s 的元数据条目,并且如果在类型级别声明变量(而不是局部变量),那么其他方法也可以使用它。当然,由于字符串实习,如果你在其他地方使用“sql cmd”,你仍然只有一个字符串 object 在内存中......但是如果你用反射查看类型,你会发现const 作为元数据中的一个字段,如果它被声明为一个常量字段,则使用第二个 sn-p,如果它只是一个局部变量,如果你构建一个,它将在 PDB 文件中。

【讨论】:

    【解决方案2】:

    const 的值总是直接写入调用者,所以是的,它们是相同的。

    此外,在源代码中找到的编译器实习生字符串 - 如果您多次使用相同的字符串,const 会很有帮助(纯粹从维护的角度来看 - 结果都是一样的)。

    【讨论】:

      【解决方案3】:

      SqlCommand 的构造函数不会“看到”任何差异,因此会以相同的方式进行操作。

      【讨论】:

        【解决方案4】:

        是的,它们完全一样。

        【讨论】:

          【解决方案5】:

          是的,请随意使用Reflector 查看程序集,编译时将用文字字符串替换 const 字符串。我也有一个blog post 来保证你使用反射器的工作:)

          【讨论】:

          • 所有文字字符串都将由当前 CLR 进行实习。它与 const 无关,它只影响变量而不是字符串实例本身(但字符串在 .NET 中是不可变的)
          【解决方案6】:

          我对此不是 100% 确定,但我敢打赌它是一样的。

          const 只会确保您不会重新评估变量,但它可以在编译时完成。

          Morover,字符串是不可变的,所以我认为声明变量与否不会有任何区别。

          但是,确定的证明是研究两种情况下生成的 IL 代码。

          【讨论】:

          • 这听起来更像是您在描述 readonly - const 不止于此(该值由调用者直接复制 - 它不是“Ldfld” / "Ldsfld"。
          • 对不起,我不完全理解你。当您说“调用者直接复制该值”时,您的意思是什么?来自 MSDN:const 字段是编译时常量 msdn.microsoft.com/en-us/library/acdd6hb7.aspx
          猜你喜欢
          • 1970-01-01
          • 2010-11-28
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          • 1970-01-01
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          相关资源
          最近更新 更多