2010-04-17 271 views
4

如果我们将属性定义为public属性,并且在此属性中我们有一个protected获取器。这是什么意思?如果财产是公共的,为此定义一个受保护的吸气者是什么意思? 请参见下面的代码:这是什么意思? [c#]

public ISessionFactory SessionFactory 
    { 
     protected get { return sessionFactory; } 
     set { sessionFactory = value; } 
    } 
+5

这是可以允许的,尽管拥有一个吸气器的能见度低于吸气器也是非常奇怪和意外的。 – 2010-04-17 13:02:43

+0

我不明白为什么它会是奇怪或意外的。如果公共吸气剂没有增加任何价值,为什么它应该是?然而,课堂上可能需要外部输入,在这种情况下,拥有公开制片人是非常合理的。将其视为方法参数。你可以设置参数,但是除非方法实际返回它们,否则你不能取回它们。当然得到它们是没有意义的,如果你是来电者,你已经可以访问它们。如果你不是主叫方,那么你可能没有访问权限的一个很好的理由。封装是很好的OOP。 – 2010-04-17 13:48:36

+0

@macke,在这种情况下,我会强烈选择Set或Initialize方法,因为属性的语义意味着可观察性。如果我可以设置Instance.X =值,我希望能够立即断言(Instance.X ==值)(如果没有执行该集合的异常)。 – 2010-04-17 14:15:14

回答

2

在C#中,您可以拥有getters and setters的访问级别(请参阅access modifiers)与整体属性不同。这是最常见的模式

public class FooObject 
{ 
    public String Foo 
    { 
     get; 
     private set; 
    } 
} 

允许对象实例化FooObject检索美孚的价值,但没有设置它的值。 setter上的私有修饰符表示只有FooObject本身具有此能力(不包括使用反射)。

有两个优点是:

  1. 通过增加自动属性(没有变量需要分配get和set值),这使得物业变量的私人环境(它为您创建在编译时),无需显式创建变量即可完成。如果没有这个,你就不能使用自动属性,除非你总是希望get和set函数全部公开,所有私有等。

  2. 它允许抽象级别,以便所有方法无论是公共的,私有的,或以其他方式通过该财产而不直接访问私有变量。有关更多信息,请参见question

在您的实例中,其他对象可能会设置会话工厂的值,但只有从它继承的类可以检索它。大多数情况下,如果一个对象可以设置该值,它也可以检索它,但有些情况下不允许它。这是允许的,因为set事件不允许比为整个属性定义的更大的访问量。

我能想到的最好的例子就是如果在set事件中,set对象被修改了。例如,如果set事件设置了一个连接对象,并且在设置事件上添加了连接字符串,并且打开了与数据库的连接(在我的例子中,我可能会重构代码而不以这种方式行事,但是可能会出现类似的情况)。

11

这意味着,吸气剂只能由子类调用。 getter之前的'protected'可以覆盖属性的getter部分的'public'。

0

受保护的GET意味着这个属性的getter只能从一个类继承这个类的访问。该集被假定为公开的,所以该属性可以被公开设置。