2012-04-16 10 views
10

Qualcuno potrebbe dirmi come motivo per cui il seguente uso di sealed non viene compilato? Considerando che, se sostituisco sealed con final e lo compilo come Java, funziona.C# sealed vs Java finale

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 –

+0

L'equivalente a 'final' per i membri in C# è' readonly'. –

risposta

45

Questo perché final in Java significa un sacco di cose diverse a seconda di dove lo si utilizza, mentre sealed in C# si applica solo alle classi e ai membri potenzialmente virtuali (metodi, proprietà, eventi).

In Java final può essere applicato a:

  • classi, il che significa che la classe non può essere ereditata. Questo è l'equivalente di sealed di C#.
  • metodi, il che significa che il metodo non può essere sovrascritto in una classe derivata. Questo è l'impostazione predefinita in C#, a meno che non si dichiari un metodo come virtual e in una classe derivata ciò può essere impedito per ulteriori classi derivate con sealed nuovamente.
  • campi e variabili, il che significa che possono essere inizializzati solo una volta. Per i campi l'equivalente in C# è readonly.
+1

"sealed in C# si applica solo alle classi" - non è vero, può essere applicato ai metodi in C#. – Maxim

2

Sealed in C# può essere applicato solo a tipi di riferimento, e ha un impatto su albero ereditarietà.

In pratica il tipo contrassegnato come sealed garantito come l'ultima "foglia" nell'albero di ereditarietà, o in breve, non è possibile derivare dal tipo dichiarato come sealed.

public sealed class Child : Base 
{ 
} 

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

Non può essere applicato a un membro.

2

La risposta di Tigran non è sbagliata mentre Joey's è un po 'scorretto.
In primo luogo è possibile esaminare questa pagina: What is the equivalent of Java's final in C#?.
la parola chiave sealed può essere applicata a class, instance method e property ma non alle variabili o ai metodi dell'interfaccia. Le classi con sealed non possono essere ereditate. Quando si utilizza il metodo sealed, è necessario che sia override in azienda. Ogni struct è sealed, quindi non è possibile ereditare struct. Controllare questa immagine: sealed usage