【问题标题】:What does it means? [c#]这是什么意思? [C#]
【发布时间】:2011-02-09 03:30:12
【问题描述】:

如果我们将一个属性定义为public 属性并且在这个属性中我们有一个protected getter。这是什么意思?如果财产是公共的,那么为此定义受保护的吸气剂意味着什么? 请看下面的代码:

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

【问题讨论】:

  • 这是允许的,虽然 getter 的可见性低于 setter 也是非常奇怪和出乎意料的。
  • 我不明白为什么会奇怪或出乎意料。如果公开 getter 并没有增加任何价值,那为什么要这样做呢?但是,该类可能需要外部输入,在这种情况下,拥有一个公共设置器非常有意义。将其视为方法参数。您可以设置参数,但除非该方法实际返回它们,否则您无法取回它们。当然,获取它们是没有意义的,如果您是调用者,您已经可以访问它们。如果您不是来电者,则可能有充分的理由您无权访问。封装是好的OOP。
  • @macke,在这种情况下,我更喜欢 Set 或 Initialize 方法,因为属性的语义意味着可观察性。如果我可以设置 Instance.X = value,我希望能够在之后立即 Assert(Instance.X == value)(如果没有异常执行设置)。
  • 很公平。除了约定之外,是否有任何实际原因为什么应该使用 set 方法来支持只写属性,因为唯一可辨别的区别是语法(当然还有接口)?如果需要设置多个属性,则使用方法当然会更有意义,但我认为这是完全不同的情况。

标签: c# oop public protected getter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    这允许实例化 FooObject 的对象检索 Foo 的值但不设置它的值。 setter 上的 private 修饰符表示只有 FooObject 本身有这个能力(不包括使用反射)。

    这样做有两个好处:

    1. 通过添加自动属性(无需变量分配 get 和 set 值),这允许属性变量的私有设置(它在编译时为您创建),无需这样做显式创建变量。如果没有这个,你就不能使用自动属性,除非你总是希望 get 和 set 函数都是公共的、私有的等等。

    2. 它允许一个抽象级别,以便所有方法,无论是公共的、私有的还是其他方法都通过属性而不直接访问私有变量。请参阅此question 了解更多信息。

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

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

    【讨论】:

      【解决方案3】:

      protected 关键字是成员访问修饰符。受保护的成员可以从声明它的类中访问,也可以从从声明该成员的类派生的任何类中访问。

      http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx

      【讨论】:

        【解决方案4】:

        protected get 意味着这个属性的getter 只能从这个类的继承类中访问。该集合被假定为公开,因此可以公开设置此属性。

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 2021-04-22
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 2011-09-04
          相关资源
          最近更新 更多