C#中访问说明符保护和内部保护有啥区别
Posted
技术标签:
【中文标题】C#中访问说明符保护和内部保护有啥区别【英文标题】:What is the difference between access specifier protected and internal protected in C#C#中访问说明符保护和内部保护有什么区别 【发布时间】:2011-03-30 20:12:08 【问题描述】:C#中的访问说明符protected
和internal protected
有什么区别?
【问题讨论】:
What does Protected Internal means in .Net 和 What is the difference between ‘protected’ and ‘protected internal’ ? 的可能重复项 【参考方案1】:Internal
可以在程序集中看到。
Protected
可以被从定义它的类继承的类看到。
Protected internal
可以在程序集或从定义它的类派生的类型中看到(包括来自其他程序集的类型)。
见:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
从页面复制:
public Access is not restricted.
protected Access is limited to the containing class or types derived from the containing class.
internal Access is limited to the current assembly.
protected internal Access is limited to the current assembly or types derived from the containing class.
private Access is limited to the containing type.
【讨论】:
受保护的内部有什么意义?保护它自己不会做同样的事情吗? @Vince,不,如果它是protected internal
并且您从另一个程序集中的类派生,您将无权访问该方法等。但如果它只是 protected
,您可以。
如果我无法访问其他程序集中的方法,那么我可以简单地将其标记为内部而不是受保护的内部。我在这里错过了什么吗? :)
@Vince 嗯是的,但是您可以访问该方法而无需派生它。
您说“如果它受内部保护并且您从另一个程序集中的类派生,您将无法访问该方法”,但是在程序集 A 中将方法标记为内部并从该类派生在装配 B 中会给你同样的结果,不是吗?【参考方案2】:
protected
表示只有当前类和从它派生的任何类都可以访问该成员。
internal
表示当前程序集中的任何类都可以访问该成员。
protected internal
本质上是指protected
或 internal
;即,从当前类派生的所有类(在任何程序集中)都可以访问该成员,就像当前程序集中的所有类一样。这与许多开发人员的预期相反——protected internal
与protected
的含义相同和 internal
(它没有)。
【讨论】:
【参考方案3】:internal
- 同一程序集中的任何内容(.dll 或 .exe)都可以看到。
protected
- 任何子类都可以看到,无论它们在哪里。
internal protected
- 同一程序集中的任何东西都可以看到和任何子类,无论它们在哪里。
Jeff Mattfield 所说的“内部进一步降低了这种可见性”的方式使其不清楚。 internal
和 protected
只是不同可见性。将两者结合在一起会使成员 more 可见。没有显式访问修饰符的东西的默认可见性尽可能小。添加任何访问修饰符总是会增加可见性。
【讨论】:
【参考方案4】:internal protected
或 protected internal
表示外部protected
(来自当前程序集外部)和内部public
(来自同一程序集内)。
【讨论】:
【参考方案5】:Protected internal 和 protected 访问说明符与继承的概念有关。
让我们举例说明protected和protected internal。
有两个命名空间,分别名为 namespace A 和 namespace B。
在命名空间A中,有一个名为classA的类,它由一个名为accept()的方法组成,使用protected 访问说明符。
在namespace B中,还有一个类,名为classB,继承自namespace A的classA .
现在借助这个 protected 说明符,我们可以访问 namespace BclassB 中的 accept() 方法/strong>。
但在使用 protected internal 访问说明符时,该概念不正确: 如果 namespace A 的 classA 的 accept() 函数使用 protected internal 访问说明符,则 classB namespace B 的 无法访问它,因为 accept() 函数只能在同一命名空间内的继承类中访问。
【讨论】:
【参考方案6】:- 更新答案 2019 -
您好,您可以通过下表找到可访问性
【讨论】:
【参考方案7】:internal protected
允许您从不是从同一对象派生的类访问同一程序集中的成员,但也允许您获得标准受保护访问以从另一个程序集中访问成员。它是内部的| protected, not internal & protected(虽然 CLR 允许后者,但 C# 不允许)
【讨论】:
据我了解,受保护的内部没有意义,受保护的内部与受保护的相同,并且允许您做完全相同的事情 @Vince - 它允许与受保护的访问相同,但也允许从同一程序集中的非派生类进行访问。 (这与受保护的不同)。区别只在它使用的程序集中很重要——在你引用它的其他程序集中——如果它是受保护的还是内部保护的,对程序员没有影响。【参考方案8】:为了更好地理解受保护和受保护内部之间的区别。最好先了解受保护和内部之间的区别。
内部变量引用同一个程序集。你不能在不同的程序集中访问。 受保护的变量,如私有变量,但您可以在同一程序集或不同程序集的驱动类中访问。
namespace InternalTest ----This namespace in assembly One
Public class A
B ol=new B();
Console.WriteLine(ol.x);//Output:5
Console.WriteLine(ol.y);//error will occured. Because protected is like Private variable
public class B
Internal int x=5;
Protected int y=5;
2) 进行不同的组装。
using InternalTest;
namespace InternalTest1 ----This namespace in assembly Two
Public class A1:B
Public void GetInternalValue()
return x; //error can't access because this is internal
Public void GetProtectedValue()
return y;//Work because it's protected
public class C
从上面的例子中可以清楚地看到,你可以在同一个程序集中访问内部,但不能在不同的程序集中访问。你可以说在同一个程序集中它看起来像公共变量。你可以通过创建类的对象来赋值
3) 受保护的内部在同一个程序集中具有两者的优点,它看起来像公共变量。 在不同的程序集中你使用像受保护的变量
【讨论】:
【参考方案9】:受保护
如果类被声明为“受保护”意味着它可以被程序集内的子类以及程序集外的子类访问。
内部
如果类被声明为“内部”意味着它可以被程序集中的任何类访问。
受保护的内部
如果该类被声明为“受保护的内部”,则意味着它只能由其派生类在程序集中进行访问。
【讨论】:
以上是关于C#中访问说明符保护和内部保护有啥区别的主要内容,如果未能解决你的问题,请参考以下文章