【问题标题】:protected internal and protected behaving similarly [duplicate]受保护的内部和受保护的行为相似[重复]
【发布时间】:2014-02-11 09:38:01
【问题描述】:

我在一个程序集中定义了以下类型。

public class TestAccessSpecifiers
    {
        public int Public { get; set; }
        protected int Protected { get; set; }
        private int Private { get; set; }
        public void SetValues()
        {
            Public = 10;
            Protected = 20;
            Private = 30;
        }
    }
    public class NewDerived : TestAccessSpecifiers
    {
        public void SetProtected()
        {
            Protected = 199;
        }
    }

在另一种类型中,我正在使用这种类型,无论我是否为受保护的财产提供受保护的或受保护的内部,我都可以从这个其他程序访问它。那么两者设置有什么区别。

class Program
    {
        static void Main(string[] args)
        {
            TestAccessSpecifiers obj = new TestAccessSpecifiers();
            obj.SetValues();
            obj.Public = 100;

            Console.WriteLine(Convert.ToString(obj.Public));
            Console.ReadLine();

        }
    }
    class Derived : TestAccessSpecifiers
    {
        public void SetNewValues()
        {
            Public = 200;
            Protected = 500;
        }
    }

【问题讨论】:

  • 这个问题与 C 究竟有什么关系?从你的语法来看,它是 C++ 而不是 Java。
  • 其实是C#。不小心选择了错误的标签。我已经编辑过了。

标签: c#


【解决方案1】:

来自MSDN:

受保护的内部

类型或成员可以被声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在派生自声明受保护内部元素的类的类声明中进行,并且必须通过派生类类型的实例进行。

protected internal 授予 both protected 和 internal 访问权限,它比单独使用任一修饰符的限制更少。

【讨论】:

    【解决方案2】:

    protected:

    同一程序集中的任何代码都可以访问类型或成员,但不能从另一个程序集中访问。

    protected internal:

    类型或成员可以被声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在派生自声明受保护内部元素的类的类声明中进行,并且必须通过派生类类型的实例进行。

    MSDN中的来源here。

    请注意,在 CLR 级别上,还有一个类似的可访问性级别,从而可以更灵活地访问是否允许从相同的程序集和派生类进行访问:

    • FamilyAndAssembly — 类似于 C# 中的 protected internal,但在 another 程序集中定义的派生类无法访问此类成员;不幸的是,C# 中没有等价物。
    • FamilyOrAssembly — 对应于 C# 中的 protected internal。

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2012-09-21
      • 2011-01-23
      • 2012-10-09
      • 2011-03-11
      • 2013-04-08
      • 2016-08-22
      • 2011-06-06
      • 2010-10-27
      相关资源
      最近更新 更多