Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这意味着什么?[c#]_C#_Oop_Public_Protected_Getter - Fatal编程技术网

这意味着什么?[c#]

这意味着什么?[c#],c#,oop,public,protected,getter,C#,Oop,Public,Protected,Getter,如果我们将一个属性定义为public属性,并且在这个属性中有一个受保护的getter。这意味着什么?如果属性是公共的,那么为其定义受保护的getter意味着什么? 请参阅以下代码: public ISessionFactory SessionFactory { protected get { return sessionFactory; } set { sessionFactory = value; } } 这意味着,getter只能由子

如果我们将一个属性定义为
public
属性,并且在这个属性中有一个
受保护的
getter。这意味着什么?如果属性是公共的,那么为其定义受保护的getter意味着什么? 请参阅以下代码:

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

这意味着,getter只能由子类调用。getter前面的“protected”可以说覆盖了属性getter部分的“public”。

protected关键字是一个成员访问修饰符。受保护成员可以从声明该成员的类内以及从声明该成员的类派生的任何类内访问


受保护的get意味着只能从此类的继承类访问此属性的getter。该集合假定为公共的,因此可以公开设置此属性。

在C#中,允许您具有不同于整体属性的访问级别(请参阅)。这是最常见的模式

public class FooObject
{
    public String Foo 
    {
      get;
      private set;
    }
}
这允许实例化FooObject的对象检索Foo的值,但不设置它的值。setter上的private修饰符表示只有FooObject本身具有此功能(不包括使用反射)

这有两个好处:

  • 通过添加自动属性(不需要变量来分配get和set值),这允许在不必显式创建变量的情况下完成属性变量的私有设置(它是在编译时为您创建的)。如果没有它,就不能使用自动属性,除非您总是希望get和set函数都是公共的、私有的等等

  • 它允许一个抽象级别,以便所有方法(无论是public、private还是其他方法)都通过属性,而不是直接访问私有变量。有关更多信息,请参见此

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


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

    这是允许的,虽然有一个比setter可见性低的getter也是非常奇怪和意外的,我不明白为什么会奇怪或意外。如果让getter公开没有任何附加值,那么为什么要这样做呢?然而,类可能需要外部输入,在这种情况下,拥有一个公共setter是非常有意义的。将其视为方法参数。您可以设置参数,但除非该方法实际返回参数,否则无法将其取回。当然,如果你是打电话的人,你已经可以访问它们了。如果您不是来电者,可能有一个很好的理由让您无法访问。封装是很好的OOP。@macke,在这种情况下,我强烈希望使用Set或Initialize方法,因为属性的语义意味着可观察性。如果我可以设置Instance.X=value,我希望能够在之后立即断言(Instance.X==value)(如果执行该设置时没有异常的话)。但是,除了约定之外,还有什么实际的原因可以解释为什么集合方法应该使用只写属性,因为唯一明显的区别是语法(当然还有接口)?如果需要设置多个属性,那么使用方法当然更有意义,但我认为情况完全不同。