2009-05-08 11 views

risposta

20

Perché C# non supporta il metodo statico variabili?

Q: In C++, è possibile scrivere un metodo statico variabile , e avere una variabile che si può accedere solo dall'interno del metodo. C# non fornire questa funzionalità. Perché?

A: Ci sono due motivi per cui C# non ha questa caratteristica.

primo luogo, è possibile ottenere quasi lo stesso effetto avendo un livello di classe statico, e aggiungendo metodo statica richiederebbero maggiore complessità.

In secondo luogo, statica a livello di metodo sono in qualche modo noti per causare problemi quando il codice viene chiamato ripetutamente o da più thread, e dal momento che le definizioni sono nelle metodi, è più difficile trovare le definizioni.

- msdn c# faq

+3

> "famigerato per causare problemi quando il codice viene chiamato ripetutamente o da più thread" - Divertente, perché l'implementazione VB.Net è considerata come thread-safe. –

+11

Thread-safe e fare ciò che si aspecifica sono due cose diverse ... –

+2

Come è stato ottenuto Checked come la migliore risposta. La risposta è semplicemente NO. Si dice, ma ancora un no. La risposta fornita qui che è una citazione di Eric Gunnerson è il cop-out di Mircosoft. È utile semplice come quello. BTW, Java ha avuto questa capacità da almeno 1.2 e C++ per tutto il tempo che posso ricordare. Si potrebbe pensare che un linguaggio che mescola C++, Java e VB sostenga le cose che tutti e tre avevano in comune.Se tre lingue supportano questo, ci deve essere una buona ragione, e lasciarlo cadere con quei due motivi è zoppo e ovviamente stanno nascondendo qualcosa. –

3

La cosa più vicina a VB.NET di Static è quello di creare un campo nel tipo di corrente. Oltre a questo C# non ha equivalenti.

1

No, CLR non supporta questo e VB.NET ricorre a trucchi del compilatore per consentirlo. Ugh.

+3

Se non ti piacciono i trucchi del compilatore, usi la parola chiave "rendimento" in C#? –

+0

Come è un trucco del compilatore? È solo una variabile membro che ha una visibilità ridotta. –

+0

Non uso mai la resa. Vorrei i metodi a variabili statiche anche se – rotard

4

No non c'è, ma come è questa differente allora avendo una variabile statica a livello di classe?

Actually if you look nella modalità di condivisione, è un trucco del compilatore che crea un campo statico sulla classe.

+1

Sì, è esattamente come avere uno a livello di classe. È consentito solo dichiararlo a livello di metodo poiché la parola chiave statica di VB legacy significa che il valore di un locale dovrebbe persistere dopo la funzione/sub-ritorno. – x0n

+0

È diverso perché il "trucco del compilatore" di VB usa anche la classe monitor per assicurarsi che sia thread-safe, e poiché è un metodo per l'ambito in modo tale che l'accesso altrove fallirà (semantica migliore). –

+0

Esegue il solo ambito perché il nome del metodo viene utilizzato per denominare la variabile. E presumerei che se lo volessi a prova di codice in C# avresti implementato anche un monitor. Preferisco vedere C# implementare un thread statico sicuro che avvolge l'accesso alla variabile come fanno in VB, ma non preoccuparti dell'ambito di un metodo. – JoshBerke

-5

Sono abbastanza sicuro che il C# è equivalente const: quindi:

 
public const Collection myCollection = new Collection(); 

Io non sono troppo familiarità con VB.NET, quindi potrebbe essere fuori dalla base, ma che vi permetterà di impostare una variabile che non può essere cambiato.

+1

variabili statiche non sono costanti. Una variabile statica è una variabile in cui ogni istanza della classe condivide la stessa istanza variabile. La variabile è mutabile e una modifica al valore in una classe cambierà il valore in tutte le altre istanze di quella classe. – NerdFury

+0

Leggera correzione. Una variabile statica in C# è condivisa. In VB una variabile statica è condivisa solo se la funzione di contenimento è condivisa. –