2009-02-10 138 views
5

帮我解决一个论点。C# - 这个声明的字符串被视为一个常量?

是这样的:

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

处理完全一样的:

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

IE浏览器。如果我特别声明字符串s是一个const,它是否有所作为?

而且,如果不以相同的方式处理,为什么不呢?

+0

你为什么使这个社区维基? – GEOCHET 2009-02-10 11:48:12

+0

Twas是一个错误 - 我不知道什么是CW。 – 2009-02-10 14:39:11

回答

6

在后者的片段,这并不是说是const的 - 那就是在变量是常量。这与C++中的const不太一样。 (字符串是总是在.NET中是不可变的。)

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

1

SqlCommand的构造函数不会“看到”任何区别,因此会采用相同的方式。

1

是的,那些完全一样。

0

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

const只会确保你不重视变量,但是它可以在编译时完成。

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

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

+0

这听起来更像是你正在描述`只读' - 'const`不止这些(该值直接**被调用者复制 - 它不是“Ldfld”/“Ldsfld”。 – 2009-02-10 11:56:31

2

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

此外,编译器在源代码中发现实际字符串 - const在多次使用同一个字符串(纯粹来自维护角度 - 结果是相同的任一方式)时很有用。

1

是的,随意使用Reflector来看看程序集,const字符串将在编译时被替换为文字字符串。我也有一个blog post关于这个来安全你使用反射器的工作:)