【问题标题】:Difference between string and const string字符串和常量字符串的区别
【发布时间】:2011-05-04 20:20:57
【问题描述】:

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

string title = "Some title.";

const string title = "Some title.";

为什么,有什么区别?

谢谢!

【问题讨论】:

  • 真的建议重命名吗?
  • 不,那是我的错误。
  • 无耻自插:stum.de/2009/01/14/… 展示了如何编译 const 字符串。

标签: c# refactoring


【解决方案1】:

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

通常,如果您有一个满足此条件的变量,则应将其声明为常量 (const),以避免代码中的错误并启用编译优化。

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

【讨论】:

  • 请注意,“常量变量”当然是矛盾的。根据定义,常量不是变量。
  • 它不仅仅是一个在运行时不会改变的变量——它是一个文字表达式。它不再是对任何东西的引用,它本质上是编译器将实际常量值复制/粘贴到所有“调用站点”中。
【解决方案2】:

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

【讨论】:

  • 你能澄清一下吗?您的解释是否意味着const string 为每个应用程序域生成一个字符串的单个实例,所有出现都与static readonly string 相同?
【解决方案3】:

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

字符串是一种特殊情况。在编译期间,编译器会运行一个字符串驻留过程,您创建的字符串变量实际上可能指向现有字符串或新字符串……因为字符串是不可变的,它通常并不重要。这不是特定于 const 字符串,而是字符串文字。

const string title = ...的例子中,const的意思是在声明时赋值,不能更改。

这是一个相关的问题,可能有您正在寻找的内容。

Is there a runtime benefit to using const local variables?

【讨论】:

  • 但是字符串不是一个值类型,它不会进入堆栈。您是指该字符串实例的地址大小吗?
  • @Andrii “stack”注释对于非字符串来说足够准确,字符串是一种特殊情况。看看 c# 编译器是如何进行字符串实习的。
  • 很酷的文章。我发现了一些新东西。但它没有回答我的问题
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    例如,你可以这样做:

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

    但不是

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

    它不会编译。

    【讨论】:

    • @gjsduarte - 我删除了字幕并将其替换为标题。这些家伙和女孩很快!
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        该工具的所有建议是,根据它的分析,有问题的字符串永远不会改变,所以您最好将其设为常量,以便将来无法更改。

        【讨论】:

          【解决方案9】:

          似乎您在其余代码中的任何地方都没有更改标题,因此它不是变量而是常量,这就是重构工具所建议的......

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-19
            • 2017-01-29
            • 2015-09-17
            • 2016-10-22
            • 2015-05-25
            • 2018-09-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多