21

我想知道protectedC#中的含义是什么,我们为什么使用它,以及关键字的好处?

例如

protected int currentColorIndex;

请详细说明。

4

7 回答 7

47

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

含义:

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

为什么我们使用它:

受保护的可访问性修饰符的常见用途是让孩子可以访问它的父母属性。您可能有一个基类,许多子类都从该基类派生。这个基类可能有一个共同的属性。这对于受保护的属性来说是一个很好的案例 - 以促进公共逻辑的重用和集中维护。

好处:

类似于“我们为什么使用它?”的问题。但本质上,它提供了对属性的粗粒度控制。你不能只考虑“当你使用受保护的时候”。更多的是选择何时使用哪个可访问性修饰符(私有、公共、内部、受保护)。因此,其好处实际上与任何可访问性修饰符的好处相同——提供健壮且一致的对象模型,最大限度地重复使用代码并最大限度地减少与错误公开代码相关的安全风险。

希望有帮助。

于 2010-09-02T12:04:54.953 回答
23

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

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
于 2010-09-02T11:43:10.020 回答
12

“受保护的成员可以从声明它的类中访问,也可以从从声明该成员的类派生的任何类中访问。”

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/protected

于 2010-09-02T11:36:55.257 回答
7

直接来自 MSDN:

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

来源

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

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

于 2010-09-02T11:37:56.360 回答
6

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

于 2010-09-02T11:38:29.030 回答
3

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

于 2010-09-02T11:37:02.857 回答
3

像这样想。一个类呈现三个接口:

  1. 面向自身,可以完全访问内部实现细节(公共、受保护、私有方法和属性)。根据定义,你在课堂上所做的任何事情都可能影响其他任何事情。
  2. 面向其客户,只能访问公共方法和属性。您将类的公共接口最小化,以最大程度地减少更改的意外后果:代码对您的内部结构了解得越少,您以后可以更自由地修改它们。
  3. 对它的后代,可以访问公共和受保护的方法和属性。无论您对受保护方法和公共方法做什么,不仅会影响客户端,还会影响修改类的基本功能的后代。OO 是关于减少耦合和增加内聚类之间没有比继承关系更强的耦合(当然,除了 C++ friend)!

第三个接口是 OO 中最难的一般设计挑战:可以合理地覆盖什么(虚拟方法和属性),为了覆盖,还需要什么其他功能(普通的受保护方法和属性)?因为这是一个如此大的挑战,所以sealed默认设置类实际上是一个好主意,但在 OO 初学者看来,这常常是违反直觉的,对他们来说,这似乎是一个不必要的障碍。

于 2010-09-02T12:06:46.590 回答