C#-此声明字符串是否被视为常量?

C#-此声明字符串是否被视为常量?,c#,clr,constants,readonly,C#,Clr,Constants,Readonly,帮我解决这场争论 这是: SqlCommand cmd = new SqlCommand( "sql cmd", conn); 与此完全相同: const string s = "sql cmd"; SqlCommand cmd = new SqlCommand( s, conn); 如果我特别声明字符串s是常量,会有区别吗 如果不以同样的方式对待它,为什么不呢 SqlCommand的构造函数不会“看到”任何差异,因此会以相同的方式运行。是的,它们完全相同。在后一段代码中,不是字符串是常量,

帮我解决这场争论

这是:

SqlCommand cmd = new SqlCommand( "sql cmd", conn);
与此完全相同:

const string s = "sql cmd";
SqlCommand cmd = new SqlCommand( s, conn);
如果我特别声明字符串s是常量,会有区别吗


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

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

是的,它们完全相同。

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


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

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

const只会确保您不会重新赋值变量,但这可以在编译时完成

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


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

常量的值总是直接烧录到调用方,因此它们是相同的


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

是的,请随意使用查看程序集,编译时const字符串将替换为文字字符串。关于这一点,我也有一个关于使用Reflector的安全说明:)

为什么你要将其作为一个社区wiki?这是一个错误-我不知道CW是什么。这听起来更像是在描述
只读
-
const
做的更多(该值由调用方直接复制-它不是“Ldfld”/“Ldsfld”。抱歉,我不完全理解您的意思。当您说“值由调用者直接复制”是什么意思?来自MSDN:常量字段是编译时常量,所有文本字符串都将由当前CLR保留。它与常量无关,它只影响变量,而不影响字符串实例本身(但字符串在.NET中是不可变的)