Csharp/C#教程:仍可从不同的程序集访问内部受保护的属性分享


仍可从不同的程序集访问内部受保护的属性

我正在为可访问性的初学者会话设置一些演示代码,我发现我能够从派生类访问内部受保护的属性。 我错过了什么?

大会1

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上设置值(标记为内部)

internal protected意味着“程序集内部或inheritance类”。 所以,是的,如果你有一个带有受保护内部成员的公共类,另一个在不同程序集中inheritance该类型的类仍然可以访问它,因为受保护的修饰符:

保护内部

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

参考: http : //msdn.microsoft.com/en-us/library/ms173121.aspx

这是C#语言的限制。 CLR支持“内部和受保护”概念。 如果您发出自己的IL,则可以使用MethodAttributes.FamANDAssem枚举来certificate这一点。 如果你真的想要这个function,你可以使用Mono.Cecil之类的东西做一些IL后期处理。 为什么C#语言没有暴露这个只是一个猜测:几乎不需要它。

因为它是internal protected工作方式。 对inheritance树( protected部分)或同一程序集( internal部分)中的子项进行访问 – 请参阅MSDN上的访问修饰符 。

而您的ExampleClass位于BaseClass的inheritance树中,它定义了Prop5 。 所以访问是由于protected部分。

它看起来像受保护的内部手段受保护或内部 。

基本上,它似乎不像那样工作。

请参阅 – https://msdn.microsoft.com/en-us/library/ba0a1yw2(VS.80).aspx

protected internal充当OR – 访问仅限于派生类或当前程序集。

通过组合protected和internal关键字,可以将类成员标记为protected internal – 只有同一程序集中的派生类型或类型才能访问该成员。

这篇MSDN文章回答了您的所有问题。

protected关键字是成员访问修饰符。 受保护的成员可以从声明它的类中访问,也可以从声明该成员的类派生的任何类中访问。

https://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.71).aspx

通过组合protected和internal关键字,可以将类成员标记为protected internal – 只有同一程序集中的派生类型或类型才能访问该成员。

https://msdn.microsoft.com/en-us/library/ms173121(v=vs.80).aspx

Protected意味着它仅与子类共享,只有private意味着它不能被其他任何人访问。

编辑:汉斯评论让你的问题更加清晰。 当你组合这样的修饰语时,它们并不是完全结合在一起的。 它可以通过internalprotected所有方式访问。

迟到的答案,但我遇到了同样的问题。 最终我想出了一个部分解决方案。

  internal Int MyInt { get; protected set; } 

它仍然在程序集中可见,但至少只有inheritance类才能实际改变它。 这足以满足我的需求。

上述就是C#学习教程:仍可从不同的程序集访问内部受保护的属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/986927.html

(0)
上一篇 2021年12月22日
下一篇 2021年12月22日

精彩推荐