C# - 这个声明的字符串是否被视为const?

时间:2009-02-10 11:44:33

标签: c# clr const readonly

帮助我在这里解决争论。

这是:

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

与此完全相同:

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

IE中。如果我明确声明字符串s是const,那会不会有所作为。

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

6 个答案:

答案 0 :(得分:7)

在后面的代码片段中,并不是字符串是const - 而是变量是const。这与C ++中的const不完全相同。 (字符串始终在.NET中不可变。)

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

答案 1 :(得分:2)

const的值总是被直接刻录到调用者中,所以是的,它们是相同的。

此外,编译器实习源在源代码中找到 - 如果您多次使用相同的字符串,则const会很有用(纯粹来自维护角度 - 结果两种方式都相同)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

是的,那些完全一样。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

const只会确保你没有重新定义变量,但它可以在编译时完成。

Morover,字符串是不可变的,所以我不认为声明变量会有什么不同。

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