受保护关键字C#

受保护关键字C#,c#,protected,C#,Protected,我想知道C#中protected的含义是什么,我们为什么使用它,以及关键字的好处是什么 比如说 受保护的int-currentColorIndex 请详细说明 “受保护的成员可以从 在它所在的类中 声明,并从任何类中 从声明 这位成员。” 看 这意味着该字段仅对类本身和继承的类可见。直接从MSDN: 受保护关键字是成员访问修饰符。受保护的成员可以在其类内以及由派生类实例访问 使用受保护意味着您可以在一个类中拥有对派生类可用的功能,但对仅实例化对象的类不可用 比较不同的访问修饰符并解释其含义,并

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

比如说

受保护的int-currentColorIndex

请详细说明

“受保护的成员可以从 在它所在的类中 声明,并从任何类中 从声明 这位成员。”


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

直接从MSDN:

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

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


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

另一个答案中提供了定义。为什么这样好?当
protected
提供对基类实现的访问时,您不必将数据/代码从基类复制到其派生类,而不必像其他人已经指出的那样暴露在
public
所暗示的不受限制的外部使用中:

受保护的关键字是一个成员 访问修饰符。受保护的成员是 可在其类内通过 派生类实例

下面是一个小例子:

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

每个人的答案都是相似的(定义和/或MSDN的摘录/链接),因此我将尝试回答您最初的3个问题:

含义:

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

为什么使用它:

“受保护的可访问性”修饰符的常见用途是为孩子提供对其父属性的访问权限。您可能有一个基类,许多子类都是从该基类派生的。这个基类可能有一个公共属性。对于受保护的属性来说,这是一个很好的例子,以便于重用和集中维护公共逻辑

好处:

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


希望有帮助。

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

  • 朝向本身,可完全访问内部实现细节(公共、受保护、私有方法和属性)。根据定义,您在类中所做的任何事情都可能影响其他任何事情
  • 面向其客户端,只能访问公共方法和属性。您可以最小化类的公共接口,以最小化更改的意外后果:代码对内部的了解越少,以后就可以越自由地修改它们
  • 面向其后代,向公众提供受保护的方法和属性。对受保护和公共方法所做的任何操作不仅会影响客户端,还会影响修改类的基本功能的子体。OO是关于约化和增加:<强>类之间没有比继承关系<强>(更确切地说,除了C++ <代码>朋友< /C>)当然更重要!李>
    第三个接口是OO中最难的一般设计挑战:什么可以被合理地覆盖(虚拟方法和属性),为了覆盖,还需要什么其他功能(受普通保护的方法和属性)?因为这是一个挑战,所以在默认情况下将类
    密封实际上是一个好主意,这对OO初学者来说常常是违反直觉的,对他们来说这似乎是一个不必要的障碍

    只是感觉它一定是重复的,但我在其他地方找不到完全相同的问题。现在你已经从这些答案中获得了基本知识,你可能想深入研究其中的一些微妙之处。请参阅以了解其中一些。相关:−1:没有回答“我们为什么使用它”的问题。但是,先生,根据您的回答,我们不声明受保护,也可以作为私有使用。@Nishant-不是这样:“私有”限制成员仅由该类使用,而对任何其他类都不可见。@Nishant-这是正确的,我应该说明受保护和私有之间的区别(Steve Townsend就是这么做的)。对客户端隐藏、e、eber,但仍使其对子类可见。谢谢。您能否澄清
    b.SomeString
    是否有效?这是MSDN中未解释的部分。@Box9,
    b.SomeString
    无效,因为它受
    保护
    protected
    基本上只是意味着
    private
    ,但继承类可以访问它(作为
    private
    变量)。@Klaus,谢谢,这是有意义的。我之所以问这个问题,是因为这个示例并没有真正说明这一点,因为代码在
    B
    的静态方法中。是否可以在抽象类中访问受保护的方法,或者我们需要重写它?例如,我有一个名为“Dad”的类,它有一个
    受保护的void WalkingAndRunning()
    方法。“D”