受保护的关键字C#

时间:2010-09-02 11:35:55

标签: c# protected

我想知道C#中protected的含义,我们使用它的原因以及关键字的好处?

例如

protected int currentColorIndex;

请详细说明。

7 个答案:

答案 0 :(得分:37)

每个人的回答都是类似的(MSDN的定义和/或摘录/链接),所以试图回答原来的3个问题:

含义:

任何标有'protected'的字段表示它只对自身和任何子节点(从中继承的类)可见。您将注意到在模型后面的ASP.NET Web窗体代码中,事件处理程序(例如Page_Load)被标记为“受保护”。这是因为ASPX Markup文件实际上从代码隐藏文件继承(查看@Page指令来证明这一点)。

我们使用它的原因:

受保护的辅助功能修饰符的常见用途是让儿童访问其父级属性。您可能有一个基类,许多子类派生自该基类。此基类可能具有公共属性。这是受保护财产的一个好例子 - 便于共同逻辑的重复使用和集中维护。

福利:

类似的问题“为什么我们使用它?”但基本上它给出了对属性的粗粒度控制。你不能只想到“当你使用受保护的”时。更多的是选择何时使用哪个辅助功能修饰符(私有,公共,内部,受保护)。因此,任何可访问性修饰符的好处都是同样的好处 - 提供健壮且一致的对象模型,最大化代码重用并最大限度地降低与错误公开的代码相关的安全风险。

希望有所帮助。

答案 1 :(得分:17)

正如其他人已经指出的那样:

  

protected关键字是成员   访问修饰符。受保护的成员是   在同班同学和   派生类实例。

这是一个小例子:

public class A
{
    protected string SomeString;
    public string SomeOtherString;
}

public class B : A
{
    public string Wrapped
    {
        get { return this.SomeString; }
    }
}

...

var a = new A();
var s = a.SomeOtherString; // valid
var s2 = a.SomeString; // Error

var b = new B();
var s3 = b.Wrapped; // valid

答案 2 :(得分:13)

  

“可以访问受保护的成员   在它所在的类中   声明,并在任何类中   派生自声明的类   这个成员。“

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

答案 3 :(得分:7)

直接来自MSDN:

  

protected关键字是成员访问修饰符。受保护的成员可以在其类和派生类实例中访问。

Source

使用受保护意味着您可以在类中使用可用于派生类的功能,但不能使用仅实例化对象的类。

This page比较了不同的访问修饰符并解释了它们的含义,并给出了不同对象(枚举,类,接口和结构)的默认修饰符表。

答案 4 :(得分:7)

另一个答案中提供的定义。为什么这样好?当protected为其提供对基类实现的访问权限时,您不必将基类中的数据/代码复制到其派生类,而不会受到public暗示的不受限制的外部使用的不必要的暴露。

答案 5 :(得分:4)

这意味着该字段仅对类本身和继承的类可见。

答案 6 :(得分:3)

这样想。一个类提供三个接口:

  1. 走向本身,可以完全访问内部实现细节(公共,受保护,私有方法和属性)。根据定义,您在课堂上做的任何事情都可能影响其他任何事情。
  2. 走向客户端,只能访问公共方法和属性。您最小化类的公共接口,以最大限度地减少更改的意外后果:代码知道的内部越少,您以后可以更自由地修改它们。
  3. 走向后代,可以访问public和受保护的方法和属性。无论您对受保护的方法和公共方法做什么,都不仅会影响客户端,还会影响修改类的基本功能的后代。 OO是关于减少coupling和增加cohesion类之间没有比继承关系更强的耦合(当然,除了C ++ friend之外)!
  4. 第三个接口是OO中最难的一般设计挑战:什么可以合理地被覆盖(虚拟方法和属性),并且为了覆盖,需要什么其他功能(普通受保护的方法和属性)?因为这是一个很大的挑战,默认情况下使用sealed课程实际上是一个好主意,与OO初学者经常看起来一样违反直觉,对他们来说似乎是一个不必要的障碍。