2011-09-24 82 views
4

我看到很多代码使用自动生成的属性,如{get; private set;}{get; protected set;}自动生成的属性{get; set;} vs {get;私人或保护集;}在C#

这个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); 
    } 
... 
} 

回答

13

它使一个属性只读由外部源(即不MyClass和/或它的子类,即类)。或者,如果您将属性protected声明为private set,则该属性只能由其子类读取,但可以自行写入。

这对你的班级没有什么影响,因为你的设置对于那个班级是私人的,所以你的班级仍然可以访问它。但是,如果您试图从另一个类实例化MyClass,那么如果它具有私有或受保护的setter,则无法修改Foo属性的值。

privateprotected意味着同样在这里,因为他们做到万无一失:private只限制到非常一流的访问,同时protected限制访问该类及其所有派生类。

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修饰作用相同的二传手,因为他们在任何其他类型的成员做。

1

它的确与众不同,当你有一个使用继承的一个类模型。如果你的MyClass的方法是你的私人领域的客户和方法没有区别。

即使你不希望你的MyClass成为任何类层次结构中的父类,它也不会伤害到将你的字段和方法范围限制到它所需的最不可见的范围。在默认情况下,使用最不可见的作用域进行封装,以便在子类开始访问它们不应该访问的父属性时不必重构。努力水平与不这样做没有什么不同。

1

如果您在getset关键字上未指定访问修饰符,则该属性将根据属性本身的访问修饰符进行访问。在你的例子中,如果你指定了get而不是private get,你将能够获得Foo的值并从程序中的任何位置设置Foo的值。

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