我正在尝试创建只能通过同一个类的构造函数设置的类的属性。
答案 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; }
}