如果我想要一个只读属性,我会这样写:
public int MyProperty { get { //Code goes here } }
但是,Microsoft 示例(以及我见过的其他一些示例)的编写方式如下:
public int MyProperty { get; private set; }
这两者之间有什么区别,我应该开始写这样的属性吗?
如果我想要一个只读属性,我会这样写:
public int MyProperty { get { //Code goes here } }
但是,Microsoft 示例(以及我见过的其他一些示例)的编写方式如下:
public int MyProperty { get; private set; }
这两者之间有什么区别,我应该开始写这样的属性吗?
正如您在第二个示例中看到的那样,您可以省略属性的实现。.NET 将自动为该属性创建一个局部变量并实现简单的获取和设置。
public int MyProperty { get; private set; }
实际上相当于
private int _myProperty;
public int MyProperty {
get { return _myProperty; }
private set { _myProperty = value; }
}
写作
public int MyProperty { get; }
根本不起作用,因为自动属性需要实现 getter和setter,而
public int MyProperty { get; private set; }
为您留下一个可能返回 any 的属性int
,但只能在当前类中更改。
public int MyProperty { get { ... } }
创建一个只读属性。
问题是:你需要什么?如果您已经有一个在您的类中使用的成员变量,并且您只想使用属性返回当前值,那么您完全可以
public int MyProperty { get { return ...; }}
但是,如果你想要一个只读属性,你需要在你的代码中(而不是从其他类)设置它而不显式声明一个成员变量,你必须采用这种private set
方法。
使用私有设置器,您只能在属性没有设置器时在实例内部分配属性值,您无法在任何地方设置其值。
如果您不在属性中使用显式成员分配,则必须private set
至少声明 a 才能为该属性设置值。否则,您将在编译时收到一条警告,指出您的属性无法分配。
如果您使用显式成员,您将能够直接为该成员分配值,而无需添加private set
:
private int member ;
public int MyProperty {
get { return member; }
}
// ...
member = 2;
int anotherVariable = MyProperty; // anotherVariable == 2
public int MyProperty
{
get
{
// Your own logic, like lazy loading
return _myProperty ?? (_myProperty = GetMyProperty());
}
}
如果您需要自己的逻辑来访问该属性,则只有一个 getter 的属性非常有用,特别是当您需要延迟加载该属性时。
public int MyProperty { get; private set; }
如果您不需要从外部更改该属性,但仍从类内部维护该属性,则具有私有设置器的属性很有用。
在这两种情况下,您都可以为实际值提供一个支持数据字段,但在前者中,您必须自己维护它,而在后者中,它由生成的代码为您维护。
使用反射访问对象时会有所不同。
public class Foo
{
public string Bar { get; private set; }
}
// .....
internal static void Main()
{
Foo foo = new Foo();
foo.GetType().GetProperty("Bar").SetValue(foo, "private?", null);
Console.WriteLine(foo.Bar);
}