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

时间:2010-03-01 16:53:32

标签: c# properties constructor set

我正在尝试创建只能通过同一个类的构造函数设置的类的属性。

5 个答案:

答案 0 :(得分:33)

This page from Microsoft描述了如何仅从构造函数中设置属性。

  

您可以通过两种方式创建不可变属性。你可以声明   set accessor.to private。该物业仅可在该物业内设置   类型,但它对消费者是不可改变的。您只能声明   get访问器,它使属性在任何地方都是不可变的,除了   在类型的构造函数中。

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

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

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

   public string Value { get; }
}

答案 1 :(得分:14)

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

public class Thing
{
   private readonly string _value;

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

   public string Value { get { return _value; } }
}

答案 2 :(得分:5)

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

答案 3 :(得分:0)

正确的方法是:

public string MyProperty{ get; private set; }

public MyClassConstructor(string myProperty)
{
     MyProperty= myProperty;
}

答案 4 :(得分:0)

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

今天的一大限制是属性必须是可变的 为了使对象初始化程序起作用:它们通过先调用 对象的构造函数(在这种情况下,默认为无参数的构造函数), 然后分配给属性设置器。

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

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

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