4

如果我想要一个只读属性,我会这样写:

public int MyProperty { get { //Code goes here } }

但是,Microsoft 示例(以及我见过的其他一些示例)的编写方式如下:

public int MyProperty { get; private set; }

这两者之间有什么区别,我应该开始写这样的属性吗?

4

5 回答 5

8

正如您在第二个示例中看到的那样,您可以省略属性的实现。.NET 将自动为该属性创建一个局部变量并实现简单的获取和设置。

public int MyProperty { get; private set; }

实际上相当于

private int _myProperty;

public int MyProperty { 
    get { return _myProperty; }
    private set { _myProperty = value; }
}

写作

public int MyProperty { get; }

根本不起作用,因为自动属性需要实现 gettersetter,而

public int MyProperty { get; private set; }

为您留下一个可能返回 any 的属性int,但只能在当前类中更改。

public int MyProperty { get { ... } }

创建一个只读属性。

问题是:你需要什么?如果您已经有一个在您的类中使用的成员变量,并且您只想使用属性返回当前值,那么您完全可以

public int MyProperty { get { return ...; }}

但是,如果你想要一个只读属性,你需要在你的代码中(而不是从其他类)设置它而不显式声明一个成员变量,你必须采用这种private set方法。

于 2013-06-13T07:15:31.550 回答
6

使用私有设置器,您只能在属性没有设置器时在实例内部分配属性值,您无法在任何地方设置其值。

于 2013-06-13T07:15:06.380 回答
4

如果您不在属性中使用显式成员分配,则必须private set至少声明 a 才能为该属性设置值。否则,您将在编译时收到一条警告,指出您的属性无法分配。

如果您使用显式成员,您将能够直接为该成员分配值,而无需添加private set

private int member ;

public int MyProperty {
    get { return member; }
}

// ...

member = 2;
int anotherVariable = MyProperty; // anotherVariable == 2
于 2013-06-13T07:14:38.920 回答
2
public int MyProperty
{
  get
  {
    // Your own logic, like lazy loading
    return _myProperty ?? (_myProperty = GetMyProperty());
  }
}

如果您需要自己的逻辑来访问该属性,则只有一个 getter 的属性非常有用,特别是当您需要延迟加载该属性时。

public int MyProperty { get; private set; }

如果您不需要从外部更改该属性,但仍从类内部维护该属性,则具有私有设置器的属性很有用。

在这两种情况下,您都可以为实际值提供一个支持数据字段,但在前者中,您必须自己维护它,而在后者中,它由生成的代码为您维护。

于 2013-06-13T07:20:35.860 回答
1

使用反射访问对象时会有所不同。

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);
    }
于 2013-11-19T14:41:53.750 回答