仅通过构造函数设置类的属性

Sri*_*lam 22 c# constructor properties set

我试图使类的属性只能通过同一个类的构造函数设置.

ste*_*yer 37

Microsoft的此页面描述了如何仅从构造函数设置属性.

您可以通过两种方式创建不可变属性.您可以将set accessor声明为private.该属性只能在类型中设置,但对消费者来说是不可变的.您可以改为仅声明get访问器,这使得该属性在所有位置都是不可变的,除了在类型的构造函数中.

在Visual Studio 2015附带的C#6.0中,有一个更改允许从构造函数设置get only属性.而且只能来自构造函数.

因此,代码可以简化为仅获取属性:

public class Thing
{
   public Thing(string value)
   {
      Value = value;
   }

   public string Value { get; }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ton 14

使属性具有只读后备字段:

public class Thing
{
   private readonly string _value;

   public Thing(string value)
   {
      _value = value;
   }

   public string Value { get { return _value; } }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,它确实.如果您使用的是C#,请更新原始帖子上的标签,以便更清楚.这个答案假设你正在使用C#.如果您不是,请再次使用您正在使用的编程语言添加标记,以便人们可以更清楚地理解问题. (2认同)

Dha*_*777 14

在 C# 9 中,它引入了“init”关键字,它是“set”的变体,这是实现此目的的最佳方法。

\n\n
\n

今天的一个很大的限制是属性必须是可变的\n 对象初始值设定项才能工作:它们通过首先调用\n object\xe2\x80\x99s 构造函数(在本例中是默认的无参数构造函数)和\n然后分配给属性设置者。

\n\n

仅初始化属性可以解决这个问题!他们引入了一个 init 访问器,它是 set 访问器的变体,只能在对象初始化期间调用:

\n
\n\n
public class Person\n{\n    public string FirstName { get; init; }\n    public string LastName { get; init; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

参考: https: //devblogs.microsoft.com/dotnet/welcome-to-c-9-0/

\n


小智 5

从c#6.0开始,你现在只能获得可以在构造函数中设置的属性(即使属性本身没有定义集合.请参见具有私有setter的属性与get-only-property