【问题标题】:How to use const in C# class constructor如何在 C# 类构造函数中使用 const
【发布时间】:2019-07-08 20:56:09
【问题描述】:

假设我有这样的课程:

public class SampleClass
{
    const string UnChangableUserName { get; private set; }
    string Password { get; private set; }

    public SampleClass(string UnChangableUserName, string Password)
    {
        this.Password = Password;
        this.UnChangableUserName = UnChangableUserName;
    }
}

我希望构造函数为 const 分配一个值,而不是在定义 const 时设置该值。我该怎么做?

我知道我不能简单地使用 set,但使用 const 更节省资源,更优雅,也更容易让其他开发人员理解,我不想要 set,所以他们不会添加它。

【问题讨论】:

    标签: c# constructor constants


    【解决方案1】:

    你不能。根据定义,C# 中的consts 是在编译时定义的,而不是在运行时。它们不能被任何代码更改,甚至是构造函数代码,因为它们在运行时甚至都不在那里——它们在每个使用点都被它们的字面值替换。

    您要查找的是readonly fieldsread only properties

    1. 只读字段由readonly 修饰符标记:

      private readonly string _username;

      只读字段只能在构造过程中赋值,要么在定义本身(readonly string _username = "blah")中直接赋值,要么在构造函数中赋值。编译器将强制执行此限制,并且不允许您在其他任何地方设置值。

    2. 只读属性只是根本不公开设置器的属性。在 C# 6 之前,您可以使用它们来返回只读字段的值(如上),但不能分配给它们。但是,从 C# 6 开始,有语法支持可以分配的只读自动属性:即使没有显式设置器,也有一个隐式设置器,它只能从构造函数或字段初始化器调用:

      public string Username { get } = "Username";

      您设置一个没有设置器的属性可能看起来很奇怪,但这只是语言的隐含部分 - 有一个隐含的支持字段 readonly,可以在初始化时设置。

    【讨论】:

    • C# 1 支持的只读属性...较新的版本带来了不同的语法来表达这一点...
    • 从技术上讲,C# 6 之前的属性可以是只读的,但不是 assignable - 您不能拥有可分配的只读自动属性。您可以拥有带有返回只读字段的 getter 的属性,这是真的,但您必须单独进行分配。
    【解决方案2】:

    一个 const 在编译时是一个 CONSTANT。您需要一个只读属性。

    https://stackoverflow.com/a/3917886/910741

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      相关资源
      最近更新 更多