我在一个程序集中定义了以下类型。
public class TestAccessSpecifiers
{
public int Public { get; set; }
protected int Protected { get; set; }
private int Private { get; set; }
public void SetValues()
{
Public = 10;
Protected = 20;
Private = 30;
}
}
public class NewDerived : TestAccessSpecifiers
{
public void SetProtected()
{
Protected = 199;
}
}
在另一种类型中,我正在使用此类型,无论我是否为受保护的属性提供受保护或受保护的内部,我都可以从其他程序访问它。然后设置两者之间有什么区别。
class Program
{
static void Main(string[] args)
{
TestAccessSpecifiers obj = new TestAccessSpecifiers();
obj.SetValues();
obj.Public = 100;
Console.WriteLine(Convert.ToString(obj.Public));
Console.ReadLine();
}
}
class Derived : TestAccessSpecifiers
{
public void SetNewValues()
{
Public = 200;
Protected = 500;
}
}
答案 0 :(得分:3)
来自MSDN:
受保护的内部
类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。
protected internal
授予 protected
和internal
访问权限,少限制性比单独使用任何修饰符。
答案 1 :(得分:1)
protected
:
类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。
protected internal
:
类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。
MSDN中的来源here。
请注意,在CLR级别上,还有一个类似的可访问级别,无论是否允许来自同一程序集和派生类的访问,都可以提供更大的灵活性:
protected internal
类似,但另一个程序集中定义的派生类无法访问此类成员;不幸的是,C#中没有相应的东西。protected internal
。