2009-09-30 3 views
6

Lasciate che vi faccia un esempio:Le migliori pratiche per la proprietà implementata automaticamente in C# e la variabile locale che differiscono solo in base al caso?

public class MyClass 
{ 
    public string MyProperty { get; set; } 

    public MyClass(string myProperty) 
    { 
     MyProperty = myProperty; // bad? 
     this.MyProperty = myProperty; // good? 
    } 
} 

ho iniziato ad usare this in questo scenario, perché ho la paranoia minore che fare affidamento su caso da solo potrebbe essere fonte di confusione o, peggio potrebbe effettivamente portare a bug.

Qual è la "migliore pratica" qui?

EDIT:

Finora, suona come questo è molto più soggettiva di quanto pensassi. Immaginavo che le persone sarebbero scese con forza da una parte o dall'altra.

+0

StyleCop "incoraggia fortemente" l'uso di "questo" –

+0

@ 280Z28, StyleCop * sempre * incoraggia l'uso di 'this', o solo nei casi in cui vi è una variabile locale che differisce dal caso da solo? – devuxer

+0

Sono stato in negozi che fanno entrambe le cose: rimuovilo o imponi l'inclusione di esso. In entrambi i casi non mi sento molto bene a riguardo :) – womp

risposta

12

Utilizzando "this." è ridondante in ogni classe. Spetta totalmente al tuo negozio di sviluppo stabilire uno standard per utilizzarlo.

I professionisti dell'utilizzo di "this." sono che alcuni sviluppatori trovano più facile associarlo nella loro mente con l'istanza di classe quando stanno leggendo il codice e, come si menziona, renderlo più chiaro quando si gestiscono articoli con nomi simili.

I lati negativi sono che alcune persone lo vedono come ingombrano il vostro file di codice e se si utilizzano strumenti come ReSharper, segnano lo codice come ridondante per impostazione predefinita.

+0

BTW - Il resharper ha opzioni per forzare questo, specialmente se si usa qualcosa come StyleCop per Resharper. –

+2

"questo" non è completamente ridondante. Se si dispone di una variabile locale denominata "myThing" e una variabile di istanza denominata "myThing", quindi "myThing" fa riferimento alla variabile locale e "this.myThing" fa riferimento alla variabile di istanza. –

+1

Il mio ricordo è che "this.myVariable" è raccomandato per evitare l'uso della notazione ungherese. In questo caso, 'this.myVariable' è raccomandato su' m_myVariable'. –

0

Entrambe le opzioni si affidano a caso da solo .... Non c'è alcuna differenza tra i due.

+0

Certo che c'è. Uno ha 5 caratteri in più che vengono letti da chiunque stia visualizzando il codice, il che può aiutare o ostacolare la comprensione del lettore. – Brian

+1

Attendi, ma in realtà non * fallirà * per dire "MyProperty = this.myProperty?". In altre parole, questo non garantisce che ciò che viene dopo è una proprietà o una variabile di livello di classe? Se sì, come puoi dire che l'unica differenza è il caso? – devuxer

5

Come ha detto Womp. "questo" è ridondante ma rende il codice più facile da leggere. O piuttosto difficile da interpretare male.

0

A mio parere, la "best practice" qui è, "non lo facciamo." Se mi imbatto in questo codice che sto esaminando, lo contrassegno immediatamente. Avere due variabili che differiscono solo per caso è un equivoco che aspetta solo di accadere. È troppo facile per un programmatore di manutenzione venire avanti mesi o anni dopo e inavvertitamente fare un asserzione a myThing invece di MyThing.

aggiunto in seguito:

Un commentatore ha chiesto per il mio suggerimento di sostituire la convenzione di denominazione/minuscole superiore. Per questo ho bisogno di un esempio concreto. Diciamo che avete un semplice Book classe che ha una sola proprietà: Title:

public class Book 
{ 
    public string Title { get; private set; } 
} 

Ora è necessario un costruttore. Una convenzione comune è quello di utilizzare una versione minuscola della proprietà:

public Book(string title) 
{ 
    Title = title; 
} 

Oppure, se si vuole fare in modo non c'è alcuna ambiguità: this.Title = title.

Si può fare l'argomento che questo è bene nei costruttori. E potrebbe essere, se tutti i costruttori fossero così semplici. Ma la mia esperienza è stata che quando un costruttore va oltre poche righe, la distinzione tra Title e title si perde. Il problema peggiora quando parli di metodi diversi dai costruttori. Ad ogni modo, hai bisogno di una convenzione diversa.

Cosa usare? Ho variamente usato e visto le abbreviazioni usate nei parametri: ttl, ad esempio.O qualcosa come bookTitle, che è più descrittivo quando si utilizza Intellisense. Secondo me, o è preferibile la convenzione di usare un nome che differisce solo caso per caso.

+0

Hai una convenzione di denominazione che eviti questo problema? Detesto iniziare a nominare tutti i miei locali 'localMyThing'. È fondamentalmente ungherese notazione. – devuxer

+0

È banale impostare StyleCop in modo che qualsiasi riferimento a proprietà (e campi) debba essere qualificato da 'this', il che rende" troppo facile per inavvertitamente assegnare la cosa sbagliata "argomento moot. –

+0

@ Jim, grazie per aver chiarito. Mi piace 'bookTitle'. – devuxer

2

C# è sicuramente case sensitive quindi non c'è alcun rischio nell'utilizzo ...

MyProperty = myProperty;

Così quindi vorrei guardare ad altre best practice come scrivere la quantità minima di codice necessaria per raggiungere il tuo obiettivo (pur essendo auto-documentando). La verità è che non è necessario, i minimalisti potrebbero dire di lasciarlo fuori.

1

Nel mio luogo di lavoro, gli standard di codifica impongono che le proprietà vengano scritte così mentre le variabili locali vengono scritte comeQueste. Poiché C# è sensibile al maiuscolo/minuscolo, questo è un buon strumento da utilizzare per distinguere le tue variabili. Se, tuttavia, ti trovi con una proprietà e una variabile locale con lo stesso identico nome, l'uso di questa parola chiave disambiggerà sicuramente l'utilizzo.

2

Ecco come Io attualmente inizializzare le proprietà utilizzando il vostro esempio (sia auto-implementato e non)

 public class MyClass 
    { 
     public string MyProperty { get; set; } 

     public string AnotherProperty 
     { 
      get { return _anotherProperty; } 
      set { _anotherProperty = value; } 
     } 
     private string _anotherProperty; 

     public MyClass(string myProperty, string anotherProperty) 
     { 
      MyProperty = myProperty; // auto-implemented property initialization 
      _anotherProperty = anotherProperty; //property with member variable initialization     
     } 
    } 

punteggiano in Uso 'questo' è finita specifica per me. So che è una proprietà locale perché è in maiuscolo. Tutte le proprietà dovrebbero essere capializzate. So che la variabile '_anotherProperty' ha scope di classe a causa del carattere di sottolineatura. Ho omesso il carattere di sottolineatura dalle variabili a livello di classe. Il codice è più facile da leggere quando il segno di sottolineatura è presente perché conosco immediatamente l'ambito senza dover passare il mouse sopra la variabile per vedere la dichiarazione nel tooltip di VS. Inoltre, ho il vantaggio di usare lo stesso nome per le variabili locali semplicemente omettendo il carattere di sottolineatura. Ciò rende le tue inizializzazioni pulite. Un altro vantaggio del carattere di sottolineatura è che è possibile digitare un carattere di sottolineatura e premere ctrl + spazio e tutte le variabili con ambito classe vengono raggruppate.

+0

Grazie, mi piace la tua spiegazione. Uso decisamente un trattino di sottolineatura per i campi di supporto esattamente per le ragioni che hai menzionato. E non uso mai la parola chiave 'this' a meno che non ci sia una variabile locale nello stesso scope con lo stesso nome e caso diverso. – devuxer