2012-07-02 16 views
13

I modificatori di accesso come public, private non sono consentiti sui costruttori statici in C#. Tuttavia, l'analisi del codice di Visual Studio ha un avviso nella categoria di sicurezza C# che dice "CA2121: Static constructors should be private".In che modo i costruttori statici possono essere resi non privati?

È possibile creare un costruttore statico non privato? O è un errore dell'analisi del codice di Visual Studio?

CHIARIFICAZIONE: Non sto cercando di rendere qualsiasi costruttore non privato. Quindi "perché?" le domande sono irrilevanti. Sono solo curioso della contraddizione tra due strumenti Microsoft e voglio vedere se c'è qualcosa che non so su come vengono gestiti i costruttori statici.

+0

Una citazione dal collegamento sopra: 'L'utente non ha alcun controllo su quando viene chiamato il costruttore statico. Se un costruttore statico non è privato, può essere chiamato da un codice diverso dal sistema. A seconda delle operazioni eseguite nel costruttore, questo può causare un comportamento imprevisto. – Tisho

+1

Penso che la citazione pertinente sia "Questa regola viene applicata dai compilatori C# e Visual Basic .NET". Quindi, no, non puoi renderlo non privato in C#. – Henrik

risposta

9

Un costruttore statico C# è sempre privato. Non dovresti mai vedere questo avviso per il codice C# e l'avviso non è utile lì. L'analisi del codice è disponibile anche per altre lingue, e sono quelle altre lingue che potrebbero causare la scrittura di classi con costruttori statici non privati.

+0

Allora perché è indicato come applicabile a C#? Pensi che sia l'errore? –

+0

@ssg Dove si dice? – hvd

+0

@ssg Se ci si riferisce a "Questa regola viene applicata dai compilatori C# e Visual Basic .NET."menzionato nel commento sulla tua domanda, quindi no, ciò significa che il compilatore garantisce già che i costruttori statici siano privati, il che significa che questo avviso non dovrebbe mai essere attivato. – hvd

3

Se si leggono i documenti che afferma chiaramente

Se un costruttore statico non è privata, può essere chiamato dal codice diverso dal sistema. A seconda delle operazioni eseguite nel costruttore, ciò può causare un comportamento imprevisto.

Suppongo che la domanda più importante sarebbe perché si vuole a?

+0

Il fatto è che non posso. Il compilatore genera un errore quando tento di anteporre lo statico a un modificatore di accesso. Forse a livello di IL? –

+0

C# non consente al cctor di non essere privato, vedere il commento di Hendriks sopra. – usr

+0

@ssg Mi chiedevo * perché * hai bisogno che sia qualcosa di diverso da "privato". Direi che probabilmente il tuo progetto è più probabile che sia sbagliato rispetto al team C# che manca un trucco per l'utilizzo di costruttori statici non privati. – James

1

È possibile creare un costruttore statico non privato?

Quale sarebbe il senso di ciò?

Un costruttore statico viene chiamato nel momento in cui la classe viene caricata dal linker, prima che venga eseguito qualsiasi metodo. Come tale, un costruttore statico potrebbe non essere sensato essere chiamato al di fuori della chiamata automatica dal linker, il che significa che non ha senso avere alcun modificatore di accesso.

Fondamentalmente non è possibile fare riferimento a una classe SENZA L'ESECUTIVO MODIFICATORE STATICO - e che prima che il codice che include il riferimento venga eseguito.

Problemi correlati