6

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

这是:

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

处理方式与此完全相同:

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

IE。如果我明确指出字符串 s 是一个常量,它会有所不同吗?

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

4

6 回答 6

7

在后一个片段中,不是字符串是 const 而是变量是 const。这与 C++ 中的 const 不太一样。(字符串在 .NET中始终是不可变的。)

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

于 2009-02-10T11:47:46.330 回答
2

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

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

于 2009-02-10T11:49:10.790 回答
1

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

于 2009-02-10T11:47:06.973 回答
1

是的,它们完全一样。

于 2009-02-10T11:47:43.990 回答
1

Yes, feel free to use Reflector to look at the assembly, const strings will be replaced with literal strings on compilation. I also have a blog post about this to safe you the work of using Reflector :)

于 2009-02-10T12:01:10.403 回答
0

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

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

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

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

于 2009-02-10T11:49:03.210 回答