【问题标题】:How do I combine `var` and `const`?如何结合`var`和`const`?
【发布时间】:2016-08-17 16:27:42
【问题描述】:

短版

在 C++ 中我可以做到这一点...

const auto & help_id = help_type.functionHelpTypeId;

如何在 C# 中做到这一点?


加长版

如何使一个变量成为 C# 中类字段或属性的只读别名?

我有一个方法,我在函数顶部创建只读别名,以便使其余代码更清晰一些,并在以后节省一些输入。

        var help_id = help_type.functionHelpTypeId;
        var changeset_version = changeset.version;
        var helpPageType = help_type.helpPageType;
        // &ct.

我的问题是,由于这些不是 const,任何人都可以重新分配它们或改变它们所指的对象,这不是我的意图。为了知道这些只是类字段的只读别名,基本上必须研究整个函数,这是不行的。

【问题讨论】:

  • 简短回答:你不能。长答案:如果您在对象构造函数中设置值,则可以使用 readonly
  • 使用const 和显式类型声明有什么问题?你试过吗? const int help_id = help_type.functionHelpTypeId;
  • “任何人都可以重新分配......”你的意思是你担心你的代码的维护者搞砸了吗?您可以在声明和分配变量的位置添加代码注释。
  • 旁注:如果您的方法非常冗长以至于您需要以这种方式保护局部变量,您可能希望将代码重构为更小的方法。
  • 这与代码长度无关,而是在处理迷宫般的字段和类型名称,并且真诚地期望 C# 与 C++ 一样具有表现力。

标签: c#


【解决方案1】:

您不能:“隐式类型的局部变量不能是常量”。

只需对const 使用显式类型。

更多讨论:Type-inferring a constant in C#

【讨论】:

    【解决方案2】:

    为了补充@AlexeiLenkov 的回答,您仍然可以创建一个其属性为只读的匿名类型:

    var help = new
    {
        help_id = help_type.functionHelpTypeId,
        changeset_version = changeset.version,
        helpPageType = help_type.helpPageType,
    };
    
    help.help_id = 312; // CS0200: It is readonly
    

    但是,这只能在本地范围内使用。另外请注意,引用类型是可变的,help 本身也是一个引用类型。

    【讨论】:

    • help 变量仍然可以被变异。它引用的值不能是,但变量本身可以。
    • @Servy 我没说不是。事实上,它甚至暗示它是可变的,因为help 是一个引用类型。也许,我应该改写它以使其清楚。
    • 您说类型是可变的,但实际上它不是,并且您提供了一个可变变量,当问题特别要求一个不是可变的变量时。跨度>
    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 2020-05-21
    • 2013-11-11
    • 2011-04-09
    • 2016-09-30
    • 2017-08-16
    • 2021-05-24
    • 2019-08-31
    相关资源
    最近更新 更多