我在protected
vs protected internal
上再次提出一个问题,因为我仍然不确定并且无法控制它们。
非常感谢任何帮助。
// DLL 1
namespace Assembly1
{
class class1 : class2
{
static void Main()
{
new class1().Test();
}
private void Test()
{
Console.WriteLine(this.sample);
}
}
}
// DLL 2
namespace Assembly2
{
public class class2
{
// protected string sample = "Test";
protected internal string sample = "Test";
//Same behavior when using protected and protected internal. Why ?
}
}
我对这两行都有相同的行为。
// protected string sample = "Test";
protected internal string sample = "Test";
但我确信应该会有一些不同。
MSDN说:
受保护:访问仅限于从包含类派生的包含类或类型。受保护的内部:访问仅限于从包含类派生的当前程序集或类型。
只要我从基类继承,我就可以从外部程序集中访问protected
和protected internal
。
非常混乱!两者看起来完全相似。任何人都可以通过修改上面的例子来解释我吗?
答案 0 :(得分:13)
protected
表示您可以从任何子类型(当然还有声明类型本身)访问该成员。因此,无论该子类型在哪里,即使它在另一个程序集中,您仍然可以访问所有受保护的成员。
internal
表示您可以从同一程序集中的任何类型访问该成员。因此,即使是位于同一程序集中的完全不相关的类也可以访问该成员。
protected internal
结合了两者,意味着两者分开申请。因此,您可以从任何子类型访问该成员,也可以从同一程序集中的任何类型访问该成员。
// Assembly 1
class A {
protected int foo;
internal int bar;
protected internal int baz;
}
class B : A {} // can access: foo, bar, baz
class C {} // can access: bar, baz
// Assembly 2
class D : A {} // can access: foo, baz
class E {} // can access neither
答案 1 :(得分:9)
protected internal
是protected
OR internal
,因此它的行为与其定义的程序集之外的行为完全相同,并且在内部行为与内部行为相同组装
有趣的是,CLR包含受保护的 AND 内部访问修饰符,它可能包含在下一版本的C#中private protected
- 这限制了对程序集中子类型的访问它被定义了。
答案 2 :(得分:1)
声明为protected
(但不是protected internal
)的任何内容仅 ,可从类型为protected
的类型中提供。
换句话说,第2组内的其他任何类型都无法访问sample
,但class2
以下的类型除外。
如果您将其声明为protected internal
,则上述情况适用,即从class2
下载的类型可以访问sample
,但另外,其他同一个程序集中的类型可以访问它。
所以,protected
:
class2
的类型可以访问sample
,,无论在
和protected internal
:
class2
的类型可以访问sample
,,无论在
sample
答案 3 :(得分:1)
这是我提出的类比。
让我们假设 asembly1 作为国家/地区。如果国家/地区引入了新的内部'法律,那么它只适用于居住在该国的人。与交通法规一样。
如果国家/地区引入了新的受保护的'法律,则适用于居住在国内或国外的公民。像财产,所得税。
受保护的内部受保护或内部。
非常感谢/ user / poke