2012-04-16 55 views
10

请问有人请告诉我下列使用sealed不能编译的原因吗?然而,如果我将sealed替换为final并将其编译为Java,则它可以工作。C#密封vs Java final

private sealed int compInt = 100; 
public bool check(int someInt) 
{ 
    if (someInt > compInt) 
    { 
     return true; 
    } 
    return false; 
} 
+0

http://stackoverflow.com/questions/2069010/is-there-any-functional-difference-between-c-sharp-sealed-and-javas-final-keywo – 2012-04-16 08:13:05

+0

相当于C#中成员的'final'是'readonly'。 “密封在C#中的 – 2012-04-16 08:14:40

回答

45

这是因为final在Java中意味着很多不同的事情取决于你在C#中使用它,而sealed适用类和潜在的虚拟成员(方法,属性,事件)。

在Java final可以应用于:

  • ,这意味着类不能被继承。这相当于C#的sealed
  • 方法,这意味着该方法不能在派生类中重写。这是C#中的默认设置,除非您将方法声明为virtual,并且在派生类中,可以再次使用sealed阻止其他派生类。
  • 字段变量,这意味着它们只能初始化一次。对于C#中的等效字段,其值为readonly
+1

仅适用于类” - 它不是真的,它可以应用于C#中的方法。 – Maxim 2016-12-12 17:47:19

2

C#Sealed只能应用于引用类型,并且对继承树影响。

在实践中,标记为sealed的类型被保证为继承树中的最后一个“叶”,或者简而言之,您不能从类型为sealed的类型中派生出类型。

public sealed class Child : Base 
{ 
} 

public class AnotherAgain : Child //THIS IS NOT ALLOWED 
{ 
} 

它不能应用于成员。

2

Tigran的答案没有错,而Joey's有点不正确。
首先你可以看看这个页面:What is the equivalent of Java's final in C#?
sealed关键字可应用于class,instance methodproperty但不包括变量或接口的方法。 sealed的类不能被继承。当sealed穿戴方法时,必须由公司内的override。每structsealed,所以struct不能被继承。检查这一形象:sealed usage