C# 字符串和常量字符串之间的差异

C# 字符串和常量字符串之间的差异,c#,refactoring,C#,Refactoring,我使用的重构工具经常建议我更改如下内容: string title = "Some title."; 到 为什么,有什么区别 谢谢 明确表示它没有改变,这样当有人阅读你的代码(包括你自己)时,她就会知道这个变量没有改变。 该工具可能会建议,如果以后不更改其他类型的变量,也可以使用该工具。这是很好的做法。 当然,如果您稍后尝试更改它,您将得到一个编译错误。在您的示例中,可以修改非常量标题,但常量不能 例如,您可以执行以下操作: string title = "123"; title = "foo

我使用的重构工具经常建议我更改如下内容:

string title = "Some title.";

为什么,有什么区别


谢谢

明确表示它没有改变,这样当有人阅读你的代码(包括你自己)时,她就会知道这个变量没有改变。
该工具可能会建议,如果以后不更改其他类型的变量,也可以使用该工具。这是很好的做法。

当然,如果您稍后尝试更改它,您将得到一个编译错误。

在您的示例中,可以修改非常量
标题,但常量不能

例如,您可以执行以下操作:

string title = "123";
title = "fool";
但不是

const string title = "123";
title = "foo"; // NO!

它不会编译。

该工具的所有建议是,基于它的分析,所讨论的字符串永远不会更改,因此您不妨将其设置为常量,以便将来无法更改。

看起来就像您不会更改代码其余部分的任何位置,因此它不是变量,而是常量,这就是重构工具建议…

如果您不打算更改字符串的值(即,它将保持不变),那么最好明确地指出它是一个常量,这在可读性方面应该会有所帮助。从技术上讲,我所知道的常数与非常数的唯一区别是所有常数都是静态的。

只有我的2美分常量是常量变量的前缀。在运行时不会改变的一个

通常,如果您有一个满足此条件的变量,您应该将其声明为常量(const),这样既可以避免代码中的错误,也可以实现编译优化


这就是重构工具为您做这件事的原因。

以及其他人所说的话。 当您用常量声明局部变量时,编译器(在发布模式下)将用IL中的常量值替换变量的用法;导致更小的堆栈

字符串是一种特殊情况。在编译过程中,编译器运行一个字符串插入过程,在这个过程中,您创建的字符串变量实际上可能指向现有字符串或新字符串。。。因为字符串是不可变的,所以它通常不太重要。这不是特定于
const
字符串,而是字符串文本

const string title=…
的示例中,
const
表示在声明时分配了值,并且不能更改

这是一个相关的问题,可能有你想要的


好吧,在我看来,使用常量字符串的主要要点是常量字符串会自动插入。因此,如果您有1000个具有常规字符串字段的类型的实例,并且所有实例存储的字符串都相同,并且永远不会更改,那么将存储1000个相等的字符串实例,从而不必要地破坏应用程序的内存配置文件。如果声明字符串常量,它将只消耗内存一次。这与直接使用字符串文字的行为相同。与静态只读字符串不同,常量字符串的值直接存储在引用类中。

常量是编译时。当您使用const string时,您在运行时不会为此变量使用空间。编译器以与宏相同的方式使用此值。当您不使用常量字符串时,它的行为与任何其他变量一样,并在运行时占用额外的空间。

它真的建议您也重命名它吗?不,这是我的错误。不知羞耻的自我插入:显示常量字符串是如何编译的。@GJSDurate-我删除了副标题,并用标题替换了它。这些人都很快!请注意,“常量变量”当然是一个矛盾修饰法。根据定义,常数不是变量。它不仅仅是一个在运行时不会改变的变量——它是一个文字表达式。它不再是对任何东西的引用,它本质上是编译器将实际常量值复制/粘贴到所有“调用站点”中。您能澄清一下吗?您的解释是否意味着,
const string
为每个应用程序域为所有事件生成一个字符串实例,与
静态只读字符串
相同?但字符串不是一种值类型,它不会叠加。你是说该字符串实例的地址大小吗?@Andrii“stack”注释对于非字符串足够准确,字符串是一种特殊情况。看看c#编译器是如何进行字符串内部处理的。@Andrii试试这篇:很酷的文章。我发现了一些新东西。但这并不能回答我的问题
const string title = "123";
title = "foo"; // NO!