我看到很多代码都使用自动生成的属性,如{get; private set;}
或{get; protected set;}
。
此private
或protected
设置的优势是什么?
我尝试了这段代码,但是当我有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);
}
...
}
答案 0 :(得分:13)
它使外部源(即不是MyClass
和/或其子类的类)的属性为只读。或者,如果您使用protected
声明属性private set
,则它的子类是只读的,但它本身是可写的。
它对您的班级没有影响,因为您的setter对该类是私有的,因此您的类仍然可以访问它。但是,如果您尝试从另一个类实例化MyClass
,则如果它具有私有或受保护的setter,则无法修改Foo
属性的值。
private
和protected
与其他地方的含义相同:private
仅限制访问该类,而protected
限制对该类及其所有类的访问权限派生类。
答案 1 :(得分:1)
当你有一个使用继承的类模型时,它会有所不同。如果您的MyClass方法是您的私有字段和方法的客户端,那么它没有任何区别。
尽管如此,即使您没有预料到MyClass会成为任何类层次结构中的父类,但将字段和方法范围限制为所需的最小可见范围也没有什么坏处。默认情况下,使用最小可见范围封装您可以使用的内容,这样当子类开始访问它们不应该访问的父属性时,您不必重构。努力程度与不这样做没有任何不同。
答案 2 :(得分:1)
如果您在get
和set
关键字上未指定访问修饰符,则可以根据属性本身的访问修饰符访问该属性。在您的示例中,如果指定get
而不是private get
,则可以从程序中的任何位置获取Foo的值并设置Foo的值。
为了编写健壮的代码,您应该尝试始终选择最具限制性的访问修饰符。最好使用属性来公开对象的状态,但不要从外部更改对象的状态。如果要更改对象的状态,请改为使用方法调用。
答案 3 :(得分:0)
根据访问器和mutator方法考虑get
和set
函数(除了您不必显式地编写方法体外:
private int foo;
public int get_Foo()
{
return foo;
}
public /* or protected, or private */ void set_Foo(int value)
{
foo = value;
}
在您看到它之后,请知道protected
和private
修饰符在setter上的工作方式与在任何其他类型的成员上的工作方式相同。