具有私有设定者的属性与没有设置者的属性之间有什么区别?

时间:2013-06-13 07:11:36

标签: c# .net properties

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

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

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

public int MyProperty { get; private set; }

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

5 个答案:

答案 0 :(得分: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; }

根本不起作用,因为自动属性需要实现一个getter 一个setter,而

public int MyProperty { get; private set; }

为您留下可以返回任何int的属性,但只能在当前类中进行更改。

public int MyProperty { get { ... } }

创建一个只读属性。

问题是:你需要什么?如果你已经有一个在你的班级中使用的成员变量而你只想使用一个属性返回当前值,你就完全可以了< / p>

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

但是,如果您想要一个只读属性,您需要在代码中设置(而不是从其他类中设置)而不明确声明成员变量,则必须采用private set方法。< / p>

答案 1 :(得分:5)

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

答案 2 :(得分:4)

如果您未在属性中使用显式成员分配,则必须至少声明private set才能为此属性设置值。否则,您将在编译时收到警告,说明您的财产无法分配。

如果您使用显式成员,则可以直接为此成员分配值,而无需添加private set

private int member ;

public int MyProperty {
    get { return member; }
}

// ...

member = 2;
int anotherVariable = MyProperty; // anotherVariable == 2

答案 3 :(得分:2)

public int MyProperty
{
  get
  {
    // Your own logic, like lazy loading
    return _myProperty ?? (_myProperty = GetMyProperty());
  }
}

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

public int MyProperty { get; private set; }

如果您需要从外部更改属性但仍在类中维护的属性,则具有私有setter的属性非常有用。

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

答案 4 :(得分: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);
    }