C# 仍然可以从其他程序集访问内部受保护的属性
我正在为一个关于可访问性的初学者会话设置一些演示代码,我发现我能够从派生类访问内部受保护的属性。我错过了什么 组件1C# 仍然可以从其他程序集访问内部受保护的属性,c#,.net,C#,.net,我正在为一个关于可访问性的初学者会话设置一些演示代码,我发现我能够从派生类访问内部受保护的属性。我错过了什么 组件1 namespace Accessibility { class Program { static void Main(string[] args) { ExampleClass c = new ExampleClass(); c.Go(); //c.Prop1
namespace Accessibility
{
class Program
{
static void Main(string[] args)
{
ExampleClass c = new ExampleClass();
c.Go();
//c.Prop1 = 10;
}
}
class ExampleClass : DerivedClass
{
public void Go()
{
this.Prop1 = 10;
this.Prop2 = 10;
//this.Prop3 = 10; //Doesn't work
//this.Prop4 = 10; //Doesn't work
this.Prop5 = 10; //why does this work?!
this.DoSomething();
}
}
}
组件2
namespace Accessibility.Models
{
public class BaseClass
{
public int Prop1 { get; set; }
protected int Prop2 { get; set; }
private int Prop3 { get; set; }
internal int Prop4 { get; set; }
internal protected int Prop5 { get; set; }
//internal public int Prop6 { get; set; } //Invalid
//internal private int Prop7 { get; set; } //Invalid
public BaseClass()
{
this.Prop3 = 27;
}
}
public class DerivedClass : BaseClass
{
public void DoSomething()
{
this.Prop1 = 10;
this.Prop2 = 10;
//this.Prop3 = 10; //Doesn't work
this.Prop4 = 10;
this.Prop5 = 10;
PropertyInfo Prop3pi = typeof(DerivedClass).GetProperty("Prop3", BindingFlags.Instance | BindingFlags.NonPublic);
int value = (int)Prop3pi.GetValue(this, null);
}
}
}
注意,在ExampleClass.Go中,我可以将一个值设置为Prop5。为什么?它被标记为内部保护,但我无法在Prop4上设置值(标记为内部),因为这是
内部保护
的工作方式。为继承树中的子级(protected
part)或同一程序集(internal
part)提供访问权限-请参阅
您的
ExampleClass
位于BaseClass
的继承树中,它定义了Prop5
。因此,访问要归功于受保护的part。通过组合受保护的关键字和内部关键字,类成员可以标记为受保护的内部-只有派生类型或同一程序集中的类型才能访问该成员
回答您的所有问题。受保护的关键字是成员访问修饰符。受保护成员可以从声明该成员的类内以及从声明该成员的类派生的任何类内访问
通过组合受保护关键字和内部关键字,可以将类成员标记为受保护内部-只有派生类型或同一程序集中的类型才能访问该成员
Protected
意味着它只与子类共享,只有private
意味着其他任何人都无法访问它
编辑:汉斯的评论让你的问题更清楚一些。当您像那样组合修改器时,它们将以包含方式而不是独占方式组合。它可以以
内部
或受保护
的所有方式访问。内部受保护
表示“程序集或继承类的内部”。因此,是的,如果您有一个具有受保护内部成员的公共类,则另一个在不同程序集中继承该类型的类仍然可以访问它,因为受保护的修饰符:
保护内部
类型或成员可以由程序集中声明它的任何代码从另一个程序集中的派生类中访问。来自其他程序集的访问必须在从声明受保护内部元素的类派生的类声明中进行,并且必须通过派生类类型的实例进行
参考:
这是C语言的一个限制。CLR支持“内部和受保护”的概念。如果您正在发射自己的IL,则枚举中有这方面的证据。如果你真的想要这个功能,你可以用Mono.Cecil做一些IL后处理。C语言为何不公开这一点只是猜测:几乎不需要它。它看起来像是受保护的内部手段。基本上,它似乎不是这样工作的 见-
受保护的内部充当OR-访问仅限于派生类或当前程序集。回答晚了,但我发现了同样的问题。最后我想出了一个局部的解决办法
internal Int MyInt
{
get;
protected set;
}
它在程序集中仍然可见,但至少只有继承类才能实际更改它。这就足够满足我的需要了。因为它是内部的或受保护的。1:显然,一个简单的谷歌搜索就能回答这个问题……我不认为它是或者either@Daniel,谷歌会带你去哪里回答这个问题,StackOverflow?“你们不应该否决投票,因为这是一个简单的问题,这意味着质量差,难以理解的问题。”丹尼尔·希尔加思我搜索了,但搜索的是内部和单独保护,而不是一起。很明显,有这么多的答案,我觉得有点傻。所以要么,要么,不局限于它是最受限制的关键词?没错。受保护的内部表示派生类型(受保护)和程序集(内部)都可以访问它。这仅适用于内部修改器。你不能把其他的结合起来。我喜欢简单的解释。