混淆:内部,受保护和受保护的内部[重复]
Posted
技术标签:
【中文标题】混淆:内部,受保护和受保护的内部[重复]【英文标题】:Confusion: Internal, Protected and Protected Internal [duplicate] 【发布时间】:2012-03-27 16:06:39 【问题描述】:可能重复:What is the difference between 'protected' and 'protected internal'?What is the difference between Public, Private, Protected, and Nothing?
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testanotherlib
public class A
internal void InternalDisplay()
Console.WriteLine("Internal Display Method.");
protected void ProtectedDisplay()
Console.WriteLine("Protected Display Method.");
protected internal void ProtectedInternalDisplay()
Console.WriteLine("ProtectedInternal Display Method.");
public void PublicDisplay()
Console.WriteLine("Public Display Method.");
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testanotherlib
public class B : A
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testanotherlib;
namespace testlib
public class C:A
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testlib;
using testanotherlib;
namespace testapp
class Program
static void Main(string[] args)
B objB = new B();
C objC = new C();
我试图了解内部、受保护和受保护内部之间的区别。为此,我使用上面的代码创建了一个示例。
在类库项目 testanotherlib 中,我有 A 类和 B 类。在类库项目 testlib 中,我有 C 类。程序类位于单独的控制台应用程序中。在 Program 类的 main 方法中,我为 B 类(objB)和 C 类(objC)创建了对象。对于 objB 和 objC,只能访问类 A 的公共方法。我预计 B 类的所有方法都可以访问 A 类的所有方法。请帮助我理解这一点。如果您需要有关该项目的任何其他信息,请随时问我。
问候, 普里扬克
【问题讨论】:
您期望在哪里能够访问 A 类的所有方法,并引用 A 类?您的代码从不尝试使用成员,这使得谈论起来很困难...... @JonSkeet:如果是 A 类,我希望能够通过引用 objB 访问所有方法。 @PriyankThakkar:来自testApp
? 为什么是你期待的? testApp
中的代码与 A
不在同一个程序集中,因此例如,任何内部成员都不可见。
微软为什么不在 MSDN 中提供 PROTECTED INTERNAL 的主题?
【参考方案1】:
protected 方法和成员只能从另一个类访问,该类派生自声明受保护方法的类。
class A
protected void Method()
class B : A
public void Foo()
Method(); // works!
class C
public void Foo()
Method(); // won't work, obviously
var tmp = new A();
tmp.Method(); // won't work either because its protected
internal 使该方法仅在同一程序集中可见。对于同一程序集中的类,该方法可以像公开一样使用。对于您当前程序集之外的课程,它就像私人一样。
现在结合 protected 和 internal 使得该方法可以在同一个程序集中用于该程序集中的所有类。并且受保护的方法使该方法可以在所有派生类中使用,无论是哪个程序集。
【讨论】:
您受到保护的内部错误,请参阅我的回答或 Chris'。 @SimonBangTerkildsen 哦,你是对的。我纠正了我的答案。不知道。好吧,我自己从来没有用过。因此 internal 有效地推翻了受保护的关键字。派生时忽略内部。不知道,事实上也不喜欢它:)但这一定是有充分理由的。 @dowhilefor: 谢谢你用精彩的例子解释它:) :)【参考方案2】:可以使用访问修饰符指定以下五个可访问性级别:
public:访问不受限制。
受保护:访问仅限于包含类或从包含类派生的类型。
内部:访问仅限于当前程序集。
受保护的内部:访问仅限于当前程序集或派生自包含类的类型。
private:访问仅限于包含类型。
Taken directly from Microsoft's MSDN library.
【讨论】:
您对“受保护的内部”的定义似乎不准确,因为“或”。你确定它不应该是“和”吗? 你可能是对的。请立即通知微软!! 哦,没注意链接,懒得搜了。对不起。而且看起来仍然很合乎逻辑。【参考方案3】:internal
仅在当前和友好的程序集中可见。
protected
仅在继承 A
的类中可见。
protected internal
在继承 A
的类中可见。并且在当前和友好的程序集中也可见。
【讨论】:
嘿西蒙..感谢您的帮助:) 受保护的内部意味着受保护的或内部的;您将其描述为受保护的和内部的。以上是关于混淆:内部,受保护和受保护的内部[重复]的主要内容,如果未能解决你的问题,请参考以下文章