请问为什么以下使用sealed
的代码无法编译通过?但是如果将sealed
替换为final
并编译为Java,则可以正常工作。
private sealed int compInt = 100;
public bool check(int someInt)
{
if (someInt > compInt)
{
return true;
}
return false;
}
这是因为在Java中,final
的含义取决于使用它的位置,而在C#中,sealed
仅适用于类和继承的虚成员(方法、属性、事件)。
在Java中,final
可应用于:
sealed
。virtual
,并且在派生类中可以再次使用sealed
防止进一步的派生类重写该方法。这就是为什么在C#中很少看到sealed
成员,而在Java中常常看到final
成员的原因。readonly
。C#
中的Sealed
关键字只能应用于引用类型,并对继承树产生影响。
实践中,被标记为sealed
的类型保证是继承树中的最后一个“叶子节点”,简而言之,您不能从声明为sealed
的类型派生出新类型。
public sealed class Child : Base
{
}
public class AnotherAgain : Child //THIS IS NOT ALLOWED
{
}
这不能应用于成员。
Tigran的回答并没有错,而Joey的回答有点不正确。
首先你可以查看这个页面:Java中final在C#中的等价物是什么?。
关键字sealed
可以应用于class
、实例方法
和属性
,但不能应用于变量或接口的方法。带有sealed
的类不能被继承。当将sealed
放在方法上时,它必须与override
一起使用。每个struct
都是sealed
的,所以struct
不能被继承。请查看此图片:
final
是readonly
。 - user166390