2010-04-13 3 views
8

Guardando le nuove funzionalità di VB 2010, mi sono imbattuto nel supporto per Auto-Implemented Properties.Perché le proprietà C# non supportano valori predefiniti come VB 2010?

Dal momento sto lavorando con C#, questo sembrava molto familiare, ma ho notato che VB ha fatto aggiungere una funzionalità mi piacerebbe avere in C#: l'impostazione di un valore predefinito arbitrario per la proprietà auto-implementato:

Public Class Person 

    Property Name As String = "Scott Guthrie" 
    Property Age as Integer = 35 

End Class 

Mi piace molto l'uso pulito delle proprietà automatiche in C#. Questo ci farebbe risparmiare lo sforzo di introdurre un backing field e collegarlo alla proprietà ogni volta che abbiamo semplicemente bisogno di un valore predefinito, raggirando così inutilmente il codice.

Mi chiedevo perché questo non è stato introdotto anche in C#? Quale potrebbe essere la motivazione per non farlo? C'è una discussione sulla sintassi o ci sono limitazioni tecniche per l'implementazione di questo?

+0

Perché un campo di supporto, non è necessario. Ma sono d'accordo che si aggiunge alla confusione. – Abel

+0

PS: non sei stato il primo a chiedere, controlla questo per ulteriori discussioni: http://stackoverflow.com/questions/169220/initializing-c-auto-properties – Abel

+0

@Abel: Ricordo di aver visto questo post. So che non è possibile e su come aggirarlo, ma ero curioso di sapere perché VB lo supporta e C# no (ancora). –

risposta

3

che dire:

public class Person 
{ 
    public Person() 
    { 
     this.Name = "Scott Guthrie"; 
     this.Age = 35; 
    } 
    public string Name { get; set; } 
    public string Age { get; set; } 
} 

, in pratica, che si riduce allo stesso e non è che molto lavoro in più, credo. Ma forse, per una volta dopo tanto tempo, VB appare più chiaro allora C# ... ;-)

EDIT (logica):
che stavi chiedendo la logica nel tuo ultimo commento sotto (e nel) la tua domanda originale Pensando ad alta voce, penso che il principio in C# che il codice di inizializzazione vada in un posto e un solo posto, cioè il costruttore, è la ragione di questa decisione. Aggiungendo un altro posto dove devi cercare il codice di inizializzazione, il debug diventa più difficile e il codice meno chiaro.

Ovviamente, un valore di inizializzazione in linea non può contenere altre inizializzazioni o calcoli (almeno, molto limitati). Mentre sono d'accordo sul fatto che possa essere più conciso nel modo VB, vorrei capire il team C# e Anders Hejlsberg se hanno detto che considerano un vantaggio maggiore avere un posto per l'inizializzazione.

MODIFICA:here's what Microsoft says about it. In breve, non per C# 4.0, ma forse C# 5.0? Inoltre:

"Non è così facile come sembra però: la prossima cosa che vogliamo è che la costruttore per inizializzare il campo supporto , ma può farlo solo attraverso il setter, che potrebbe non essere quello che vuoi."

e (solo un commentatore):

"mancanza di inizializzazione o costruttore controllo rende la funzione praticamente inutile oggetti ritornano un tipo riferimento"

.
+0

commenti James Curran su quella risposta da dire -. "DefaultValueAttribute non imposta il valore di una proprietà Tutto ciò che fa è dire Visual Studio quale sia il valore di default dovrebbe essere, in modo che nella finestra delle proprietà, l'saranno in grassetto, se non è impostato su tale valore non cambia il valore in alcun modo " –

+0

si veda il commento in altro thread:". DefaultValueAttribute non viene impostato il valore di una proprietà. Tutto ciò che fa è dire Visual Studio quale sia il valore di default dovrebbe essere, in modo che nella finestra delle proprietà, l'saranno in grassetto, se non è impostato su tale valore. non cambia il valore in alcun modo ". –

+0

Se non sbaglio, 'DefaultValue' imposta solo il valore per Visual Studio, nel riquadro delle proprietà, ma non imposta il valore al momento dell'esecuzione. – Shimrod

10

Perché non solo predefiniti nel costruttore? Questo è quello che è anche per

+0

Esattamente. Spot on. – Finglas

+1

Questo è quello che faccio di solito, ma a volte può essere utile vedere i valori predefiniti alla dichiarazione. –

+2

È possibile avere più costruttori, quindi più valori predefiniti. Quindi, mentre è una buona soluzione, non è così pulita come fornire un unico valore predefinito. –

0

Anche se non sono Microsoft, suggerirei che il vantaggio percepito fosse inferiore al costo per implementare, testare e supportare la funzionalità.

Naturalmente, si può solo impostare i valori di default dichiarando un costruttore, ma sono d'accordo che la sintassi VB è un po 'più chiaro (soprattutto se avete intenzione di decorare con metadati quali <DefaultValue(...)>)

0

Ho una soluzione per la noiosa attività di conversione di una proprietà automatica in un campo di proprietà-con-backing: Il mio addin , AtomineerUtils eseguirà il refactoring per te con un singolo tasto.