自动生成的属性{get; set;} vs {get; C#中的private或protected set;}

时间:2011-09-24 01:43:53

标签: c# properties

我看到很多代码都使用自动生成的属性,如{get; private set;}{get; protected set;}

privateprotected设置的优势是什么?

我尝试了这段代码,但是当我有Foo{get; set;}时,它就是一样的。

public class MyClass
{
    public int Foo {get; private set;}
    public static void RunSnippet()
    {
        var x = new MyClass();
        x.Foo = 30;
        Console.WriteLine(x.Foo);
    }
...
}

4 个答案:

答案 0 :(得分:13)

它使外部源(即不是MyClass和/或其子类的类)的属性为只读。或者,如果您使用protected声明属性private set,则它的子类是只读的,但它本身是可写的。

它对您的班级没有影响,因为您的setter对该类是私有的,因此您的类仍然可以访问它。但是,如果您尝试从另一个类实例化MyClass,则如果它具有私有或受保护的setter,则无法修改Foo属性的值。

privateprotected与其他地方的含义相同:private仅限制访问该类,而protected限制对该类及其所有类的访问权限派生类。

答案 1 :(得分:1)

当你有一个使用继承的类模型时,它会有所不同。如果您的MyClass方法是您的私有字段和方法的客户端,那么它没有任何区别。

尽管如此,即使您没有预料到MyClass会成为任何类层次结构中的父类,但将字段和方法范围限制为所需的最小可见范围也没有什么坏处。默认情况下,使用最小可见范围封装您可以使用的内容,这样当子类开始访问它们不应该访问的父属性时,您不必重构。努力程度与不这样做没有任何不同。

答案 2 :(得分:1)

如果您在getset关键字上未指定访问修饰符,则可以根据属性本身的访问修饰符访问该属性。在您的示例中,如果指定get而不是private get,则可以从程序中的任何位置获取Foo的值并设置Foo的值。

为了编写健壮的代码,您应该尝试始终选择最具限制性的访问修饰符。最好使用属性来公开对象的状态,但不要从外部更改对象的状态。如果要更改对象的状态,请改为使用方法调用。

答案 3 :(得分:0)

根据访问器和mutator方法考虑getset函数(除了您不必显式地编写方法体外:

private int foo;

public int get_Foo()
{
    return foo;
}

public /* or protected, or private */ void set_Foo(int value)
{
    foo = value;
}

在您看到它之后,请知道protectedprivate修饰符在setter上的工作方式与在任何其他类型的成员上的工作方式相同。