14

我只想知道私有受保护的内部访问说明符之间的实际区别是什么。我所知

对自己的类成员可见:私有和受保护的内部YES

对其他类的对象可见:两者都没有

对命名空间集合之外的其他类的对象可见:两者都没有

对命名空间集合外的子类对象可见:两者都没有

如果private和protected internal做同样的事情,那么为什么我们只需要一个就足够了?

4

7 回答 7

26
  • protected internal成员对当前程序集中的任何代码另一个程序集中的派生类中的任何代码都是可见的。用技术术语来说,它是 和 的逻辑析protectedinternal
  • 成员仅对同一类中的private代码可见。

protected internal实际上是仅次于 . 的第二个最宽松的访问修饰符public


值得注意的是,protected它可以说比宽松internal,因为它允许从您无法控制的代码(即其他程序集)进行访问。虽然internal允许从当前程序集中的所有代码访问,但此代码是您的,您可以控制它!

换句话说,protected(和protected internal)成员是程序集公共 API 的一部分(因此应该记录在案)。internal成员不是。

于 2012-06-09T10:46:43.300 回答
25

图形概览(简而言之)

能见度

于 2014-04-11T08:06:38.593 回答
4

private仅对自己的类成员可见,而对子protected internal以及命名空间集合中的其他类可见。

于 2012-06-09T10:46:08.590 回答
3

私人的

类型或成员只能由同一类或结构中的代码访问。

受保护的内部

同一程序集中的任何代码或另一个程序集中的任何派生类都可以访问该类型或成员

于 2012-06-09T10:47:04.427 回答
0

我认为受保护的内部意味着只有继承并位于同一程序集中的类才能看到该属性。那些派生类并且来自不同程序集的人看不到它。

LE:请阅读 Mattias Buelens 对此的评论。

于 2012-06-09T10:47:43.183 回答
0

实际上,我通常只对变量使用 private 以确保它们不会被其他类滥用。

然而,受保护的内部,我经常将用于我不希望大多数其他类能够使用但我希望能够访问以编写测试用例的方法。它非常方便,因为它允许在健全的命名空间或包结构中创建测试类,然后可以访问那些受保护的内部方法,而不会不适当地将它们开放给世界其他地方。

这种方法确实需要一种编码方法,其中编写容易“可测试”的代码是优先事项。如果这不是我的方法,我不确定我会在很多场合使用受保护的内部。

于 2012-06-09T10:51:51.740 回答
0

我试图通过阅读不同论坛和博客提供的描述来了解 .NET 上下文中受保护的内部和内部之间的区别。我真的无法理解然后我使用 VS2015 创建了 2 个单独的程序集。大概现在我有了基本的了解。我想和你分享,它可能对某人有帮助。我试图使用另一个程序集中在一个程序集中声明的字段。我还尝试从另一个程序集中声明的类派生。这是来自程序集 1 的 class1.cs 的代码

namespace Z_Dll_1
{
    public class PublicBaseClassAssemblyOne
    {
        internal int _myinternal = 200;
        protected internal int _protectedinternal = 100;
        protected int _myProtected = 123;
        private int _myPrivate = 2;
        public int _myPublic = 45;
    }

    public class DerivedClassAssemblyOne : PublicBaseClassAssemblyOne
    {
        protected internal int intM = 10;
    }

    internal class MyInternalClass
    {
        public void MyMethod()
        {
            Console.WriteLine("Method one with internal class");
            PublicBaseClassAssemblyOne cl1 = new PublicBaseClassAssemblyOne();
            cl1._myinternal = 1000; //Internal type is available since it is in same assembly
            cl1._protectedinternal = 10; // protected internal is available
            cl1._myPublic = 2;  // Public OK
            //cl1.myPrivate = ?? // nor available since it is private

            DerivedClassAssemblyOne drOne = new DerivedClassAssemblyOne();
            drOne._myinternal = 30; // Internal and available from derived class
            drOne._myPublic = 1; // Public 
            drOne._protectedinternal = 2; // Able to be accessed from same assembly or derived class from other assembly
        }
    }
}

这是来自另一个程序集的代码,class2.cs 使用 Z_Dll_1;

namespace Z_Dll_2
{
    public class ClassAssembly2
    {
        public ClassAssembly2()
        {
            PublicBaseClassAssemblyOne classfromOtherAssembly = new PublicBaseClassAssemblyOne();
            classfromOtherAssembly._myPublic = 0; //Only public is available
        }
    }

    public class ClassDerivedFromOtherAssemblyClass : PublicBaseClassAssemblyOne
    {
        public ClassDerivedFromOtherAssemblyClass()
        {
        }
        void ClassDerivedFromOtherAssemblyClassTestMethod()
        {
            //_myinternal = 200; // can't access since it was internal to other assembly
            _protectedinternal = 100; // this can be accessed as it is  derived class from other class that has protected internal 
            _myProtected = 123; // Ordinary protected data accessed from derived class
            //_myPrivate = 2; //Private member can't be accessed from  derived class
            _myPublic = 45; // Public can be accessed anyway

            //Try to create an instance of internal class
            //MyInternalClass intClass = new MyInternalClass(); //Not accessible from this assembly
        }
    }
}
于 2015-11-25T15:33:31.777 回答