字符串和常量字符串之间的区别

本文关键字:字符串 区别 常量 之间 | 更新日期: 2023-09-27 17:55:16

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

string title = "Some title.";

const string title = "Some title.";

为什么,有什么区别?

谢谢!

字符串和常量字符串之间的区别

const 是常量变量的前缀。一个在运行时不会更改的。

通常,如果你有一个满足这个要求的变量,你应该将其声明为常量(const),以避免代码中的错误并启用编译优化。

这就是重构工具为您执行此操作的原因。

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

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

字符串特别是一种特殊情况。在编译过程中,编译器会运行一个字符串驻留过程,其中您创建的字符串变量实际上可能指向现有字符串或新字符串...由于字符串是不可变的,因此通常不会太重要。这不是特定于const字符串,而是特定于字符串文本。

const string title = ... 的示例情况下,const 表示值是在声明时赋值的,并且不能更改。

这是一个相关的问题,可能有您要查找的内容。

使用 const 局部变量对运行时有好处吗?

明确表明它不会改变,这样当有人阅读你的代码(包括你自己)时,她就会知道这个变量不会改变。
该工具可能也建议其他类型的变量,如果您以后不更改它们。这是很好的做法。
当然,如果您稍后尝试更改它,则会收到编译错误。

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

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

string title = "123";
title = "fool";

但不是

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

它不会编译。

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

const 是编译时。当您使用 const 字符串时,您最终不会在运行时为此变量使用空格。编译器使用此值的方式与宏没有什么不同。当您不使用 const 字符串时,它的作用与任何其他变量一样,并在运行时占用额外的空间。

该工具建议的是,根据它的分析,有问题的字符串永远不会改变,所以你不妨把它作为一个常量,这样它就不会在将来被改变。

似乎就像您不会在代码其余部分的任何地方更改标题一样,因此它不是一个变量,而是一个常量,这就是 refacotring 工具所建议的......