摘自:internal(C# 参考)
摘自:sealed(C# 参考)
Internal:访问仅限于当前程序集。
protected internal:访问限制到当前程序集或从包含派生的类型的类别。
程序集就是代码编译后bin目录下生产的.exe或者.dll文件,就等同于一个项目一个程序集。
/*项目ConsoleApp1*/
using ConsoleApp1_2;
using ConsoleApp1_3;
using ConsoleApp2_2;
using ConsoleApp2_3;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var test1 = new TestInternal1();//不同命名空间,同一个项目
var test2 = new TestInternal2();
//var test3 = new TestInternal3();//不可访问,因为具有一定保护级别internal
var test4 = new TestInternal4();
test1.Name = "Ann";
test2.Name = "Bob";
//test4.Name = "Sum";//不可访问,因为具有一定保护级别internal
Console.WriteLine(test1.Name + " " + test2.Name);
Console.ReadKey();
}
}
}
namespace ConsoleApp1_2
{
internal class TestInternal1
{
public string Name { get; set; }
public string Address { get; set; }
}
}
namespace ConsoleApp1_3
{
public class TestInternal2
{
internal string Name { get; set; }
internal string Address { get; set; }
}
}
/*项目ConsoleApp2*/
namespace ConsoleApp2_2
{
internal class TestInternal3
{
public string Name { get; set; }
public string Address { get; set; }
}
}
namespace ConsoleApp2_3
{
public class TestInternal4
{
internal string Name { get; set; }
internal string Address { get; set; }
}
}
应用于某个类时,sealed 修饰符可阻止其他类继承自该类。 在下面的示例中,类 B 继承自类 A,但没有类可以继承自类 B。
class A {}
sealed class B : A {}
在下面的示例中,Z 继承自 Y,但 Z 无法替代在 X 中声明并在 Y 中密封的虚函数 F。
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
应用于方法或属性时,sealed 修饰符必须始终与 override 结合使用。
因为结构是隐式密封的,所以无法继承它们。