2014-05-13 11 views
6

di Microsoft sul C# Coding Conventions (C# Programming Guide) afferma esplicitamente:Perché "Non accedere a un membro statico definito in una classe base da una classe derivata." Articolo

"Non accedere a un membro statico che viene definito in una classe base da una classe derivata ."

Perché non si deve accedere al membro statico?

Sembra che esistano scenari validi in cui ciò dovrebbe accadere, ad esempio tutti i membri const sono statici. Le classi derivate non dovrebbero mai essere in grado di leggere un membro const definito nella classe base?

+0

Dai un'occhiata a questa domanda: [Evitare "Accesso a un membro statico di un tipo tramite un tipo derivato"] (http://stackoverflow.com/questions/4405953/avoiding-access-to-a-static- membro-di-un-tipo-via-a-derivato-tipo? rq = 1) –

risposta

6

Utilizziamo come esempio object.ReferenceEquals. Qui ci sono alcuni modi è possibile chiamare questo metodo da una classe derivata:

class A { 
A() { 
    ReferenceEquals("a", "b"); //your warning is based on this style 
    object.ReferenceEquals("a", "b"); //recommended style 
} 
} 

Il fatto che ReferenceEquals è accessibile in A è solo una coincidenza. Un metodo statico è indipendente da qualsiasi gerarchia di ereditarietà. Pertanto, chiamalo sempre pienamente qualificato da qualsiasi luogo.

Questo avviso riguarda solo lo stile e la chiarezza. Tutte le varianti che ho mostrato sono compilate con lo stesso IL.

Un'interpretazione diversa potrebbe essere l'uso improprio dell'ereditarietà per abbreviare la sintassi utilizzata per richiamare un metodo. Questo è un abuso di ereditarietà. ASP.NET MVC esegue questa operazione con la classe di base Controller. Ti permette di scrivere return View();. Usa l'ereditarietà per mettere a disposizione un insieme di metodi.

+0

I tuoi primi due (accedendo come un metodo di istanza) non compilano in C#; forse stai pensando a Java? –

+0

@TimS. anzi, era Java. Grazie. – usr

Problemi correlati