【问题标题】:Resharper always suggesting me to make const string instead of stringResharper 总是建议我制作 const 字符串而不是字符串
【发布时间】:2009-05-26 08:57:03
【问题描述】:

哪个好:

string sQuery = "SELECT * FROM table";

const string sQuery = "SELECT * FROM table";

为什么 resharper 总是建议我这样做?

【问题讨论】:

    标签: resharper constants


    【解决方案1】:

    后者更好——这意味着:

    • 这不是一个实例变量,因此您不会在创建的每个实例中都得到一个冗余的字符串引用
    • 您将无法更改变量(您可能不想这样做)

    在从其他程序集访问和版本控制方面,“const”还有一些其他影响,但看起来这是一个私有字段,所以它不应该成为问题。您可以大部分将其视为:

    static readonly string sQuery = ...;
    

    一般来说,我认为在可能的情况下将字段设为静态(如果它不因实例而变化,为什么它应该是实例变量?)并在可能的情况下设为只读(可变数据更难原因)。如果您希望我详细了解static readonlyconst 之间的区别,请告诉我。

    【讨论】:

    【解决方案2】:

    如果字符串永远不会改变并且永远不会在程序集之外使用,那么 const 是一个好主意。如果它永远不会改变,但 在您的程序集之外使用,则静态只读可能是一个更好的主意 - 常量在调用站点“烧录”,而不是存储在一个位置,因此重新编译程序集包含 const 的组件不会更新依赖程序集——它们也必须重新编译。另一方面,静态只读变量会在依赖程序集中得到更新。

    【讨论】:

    • " 在您的程序集之外,静态只读可能是一个更好的主意“为什么?
      即使他们想更改“静态 sQuery”或“静态只读 sQuery”,也不会更改任何内容。 ? .
    • Readonly 确保您不会尝试重新分配给它,并且静态变量仍然是变量(与 const 不同),因此如果您更改定义它的程序集中的字符串,更新会传播到依赖项组件。当您更改 const 时不会发生这种情况,除非您也重新编译依赖程序集。
    • 注意,如果是局部变量而不是字段,这是不适用的。 :)
    【解决方案3】:

    ReSharper 仅在特定字符串引用从未更改时才建议这样做。在这种情况下,您可以使用const string 而不仅仅是string 来表达您的意图。

    【讨论】:

      【解决方案4】:

      这样做是因为如果您不小心在代码中为 sQuery 分配了一个新值,如果它是一个 const,您将得到一个编译错误,因此它会在编译时捕获一个错误。与它的建议相同,将在 ctor 中设置的成员变量设置为只读

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        相关资源
        最近更新 更多