Perché un riferimento a un oggetto non dovrebbe avere accesso a un membro statico in C #

5

Contesto della mia domanda:

  1. Sto leggendo C #.
  2. Cercando di capire la parola chiave statica.
  3. Capisco che quando Statico viene applicato a un membro di una classe, può essere modificato solo dalla classe e non dai riferimenti all'oggetto classe.

Farò un esempio qui.

public class BluePrint
{
   public static string BluePrintCreatorName;
}

Se ho bisogno di conoscere il nome di BluePrintCreator, posso chiamare

BluePrint.BluePrintCreatorName;

Ma se una casa creata dal progetto vuole conoscere il nome di BluePrintCreator, non ha accesso.

BluePrint NewHouse = new BluePrint();
NewHouse.BluePrintCreatorName; //This is not accessible

Errore del compilatore dice:

Member 'AccessModifier.BluePrint.BluePrintCreatorName' cannot be accessed 
with an instance reference; qualify it with a type name instead 

Comprendo questo è il modo in cui funziona . Ma voglio sapere il concetto di base sul perché la parola chiave statica è stata richiesta?

Cosa potrebbe andare storto se un riferimento a un oggetto di classe avrebbe accesso al membro statico?

    
posta Suyash 04.07.2014 - 11:02
fonte

3 risposte

10

Niente di sbagliato nell'accedere a un membro statico da un'istanza, infatti questo è perfettamente possibile in altri linguaggi come java, il tuo codice di esempio compila e gira ok se è in java.

È un controllo che i progettisti di compilatori hanno introdotto perché pensavano che questo avrebbe aiutato i programmatori a scrivere codice chiaro con questa lingua. In questo modo, solo guardando il codice puoi sempre sapere se stai accedendo a static oa un membro di istanza, nelle lingue in cui tale accesso è consentito (come java) a volte è un po 'di confusione quando qualcuno decide di accedere a static membro in tutta una variabile di istanza, in effetti normalmente quando vedi questo accesso in codice java è più un errore di un programmatore che usa veramente questa "funzione del linguaggio".

A mio parere limitare questo accesso è una buona decisione in C # per evitare alcuni errori e cattive interpretazioni.

Sebbene sia legale in Java per riferirsi a static membri in questo modo, è raccomandato contro in Convenzioni di codice ( 10.2 Riferimenti alle variabili e ai metodi della classe ):

"Avoid using an object to access a class (static) variable or method. Use a class name instead..."

    
risposta data 04.07.2014 - 14:53
fonte
23

Considera il seguente codice (legale) Java:

Thread workerThread = new MyWorkerThread();
workerThread.start();
workerThread.sleep(5000);

A prima vista, sembra che l'ultima riga richieda che workerThread dorma per cinque secondi. Tuttavia, il metodo Thread.sleep è in realtà static e rende il corrente thread sleep.

In C #, richiedere le funzioni static da chiamare attraverso la classe anziché un'istanza aiuta a prevenire la scrittura di codice fuorviante come questo.

    
risposta data 17.07.2014 - 15:09
fonte
0

What will go wrong if a class object reference would have access to the static member?

Non è il riferimento che conta, un riferimento è per voi per sapere con quali istanze avete a che fare. % membri distatic funzionano così; fanno parte di una classe, ma non fanno parte di un'istanza derivata da quella classe.

I understand this is the way it works. But I want to know the basic concept to why Static keyword was required at all?

Prima che OOP fosse maturo, non esistevano ambienti di runtime che consentissero l'inizializzazione di singoli oggetti. I programmi erano fondamentalmente una raccolta di subroutine che si chiamavano a vicenda in modo coeso. Puoi pensare a questo come "statico" per avere l'idea giusta. Anche quando OOP è diventato maturo, l'idea di classi indipendenti è ancora attraente perché sono accessibili incondizionatamente. A livello di runtime le classi statiche sono uguali anche alle istanze, ma questo non è il modo in cui fanno appello alla lingua. Ora c'è anche qualcosa come membri statici, ma avere quelli in congiunzione con una classe non statica è insolito perché potrebbe causare un comportamento imprevisto con operazioni asincrone, nota che questo non si applica ai membri static readonly .

    
risposta data 04.07.2014 - 15:24
fonte

Leggi altre domande sui tag