2010-04-29 13 views
12

Ho letto un articolo su using C# 3 features in C# 2 in cui è possibile ad esempio digitare var x = 2; e anche se il progetto è un progetto 2.0, il compilatore di Visual Studio 2008 lo preleva e genera lo stesso codice come se fosse int x = 2.Sta usando la parola chiave var bad in C# 2.0?

Ma ciò che non ottengo è, in caso di non fare questo in alcuni casi? Ho sempre pensato che la parola chiave var non arrivasse fino al C# 3. Se il compilatore genera lo stesso codice e posso digitare esattamente il codice C# 3 e il codice C# 2, qual è la differenza, perché la CLI è la stessa , destra?

Citazione dal link qui sopra

Dietro le quinte, il compilatore genera regolare NET 2.0 del codice.

C'è qualche differenza tra il codice .NET 2.0 e il codice .NET 3?

+3

Si mescolano versioni C# e .Net Framework. "utilizzando le funzionalità C# 3 in C# 2" - è una dichiarazione errata. Dovrebbe essere "utilizzare le funzionalità di C# 3 in .Net 2.0". –

risposta

25

temo si stia mescolando fino versioni # C e versioni .NET.

Non è possibile utilizzare var in C# 2.0, il compilatore pensa che sia solo un identificatore. Ma puoi usarlo in C# 3.0 per il targeting .NET 2.0, dal momento che var è solo un costrutto linguistico (C#), non un costrutto .NET. Il compilatore .NET lo tradurrà nel tipo appropriato nel CIL generato, quindi il compilatore JIT non lo vedrà mai e starai completamente bene.

Poiché il compilatore VS2008 è un compilatore C# 3.0, non avrete problemi a utilizzare var, indipendentemente dalla versione .NET scelta.

+0

Aha! Questa era la risposta che stavo cercando. Questa potrebbe essere un'altra domanda, ma c'è qualche differenza tra il codice risultante tra .NET 2 e .NET 3 in quel caso, cioè la cosa risultante dopo che il compilatore fa la sua cosa? – Patrick

+0

Il CIL è esattamente come se avessi scritto il tipo restituito dall'espressione sul lato destro del tuo compito; non importa quale versione di .NET si sta puntando. – Gorpik

+0

Quindi la differenza tra .NET 2 e .NET 3 è che .NET 3 pacchetti con alcune classi extra (come LINQ) e la sintassi è in realtà la stessa (se si utilizza un compilatore C# 3 come VS2008)? – Patrick

7

var è zucchero sintattico nel linguaggio C# 3 utilizzato da VS2008. il codice può ancora essere compilato per essere compatibile con .net 2.0. L'unico problema che dovresti avere è se devi modificare quei file in VS2005.

+2

Ovviamente fa parte del C# 3. Non fa parte di .NET 3.5, ma è una cosa diversa. – Gorpik

+0

grazie Gorpik, ho modificato la risposta –

+0

Ah, capisco. Ciò ha senso. Quindi posso ancora scegliere come target .NET 2 con il mio VS 2008 e consentire agli utenti di VS 2005 di utilizzare le mie DLL. Questo è veramente carino. – Patrick

1

su var: è puro sintassi per lo zucchero e il trucco del compilatore. digitando var chiedete a un compilatore di indovinare il tipo basato sul lato destro dell'espressione. questo può essere fatto facilmente compilando in .net 2.0. Linq potrebbe non funzionare perché utilizza assembly da .net 3.5

+2

LINQ funziona, nel senso che il compilatore tradurre le espressioni di query per le chiamate a Dove, SelectMany ecc Poi non riuscirà a compilare se non riesce a trovare nessuna tali metodi (che di solito sempre succedere, dal momento che fa System.Linq.Enumerable non esiste in .NET 2.0), ma se fornite i vostri metodi Where, SelectMany, ecc., dovrebbe legarli a loro e lavorare. – Joren

-2

var è stato introdotto per contenere le istanze di tipi anonimi in C# 3.0.

In .net2.0 può essere il compilatore VS2008 o C# deve essere sostituito con il tipo effettivo che è noto al momento della progettazione e se si conosceva già il tipo durante la codifica, perché si dovrebbe usare var! :)

+2

'var' non implica un tipo anonimo, lo abilita solo. Per esempio. 'var x = 1;', x sarebbe int, non un tipo anonimo. –

+0

concordato: var può rappresentare qualsiasi tipo. non lo useresti per un tipo già noto al momento della codifica, preferiresti usarlo per i tipi anonimi! –

+0

e tutto quello che ottengo è un voto negativo ?? –

4

Per quanto riguarda il suo utilizzo.

Non è male per quanto riguarda l'esecuzione, come già accennato è solo lo zucchero di sintassi e viene sostituito in fase di compilazione.

Durante la codifica, penso che il suo utilizzo sia misto. Ad esempio:

Penso che questo sia ok. E 'facile vedere che cosa il valore è

var a = "test"; 

Non così buono, molte persone hanno per scorrere nell'IDE di comprendere realmente il codice, che è un dolore.

var b = SomeReallyLongNameSpace.SubNamespace.Namespace.Class.Enum.Value1; 

Questo va bene, si sa che cosa il risultato è perché un metodo ben definito.

var c = GetString(); 

non avete idea a colpo d'occhio ciò che viene restituito, questo non è utile e sarebbe meglio definito piuttosto che utilizzare la parola chiave var.

var d = GetSomething(); 
+0

Sono d'accordo. Si tratta di leggibilità. Se il tipo che stai assegnando a una var è ovvio, usa 'var'. Se non è ovvio, usa il nome del tipo. Ovviamente, quando si parla di tipi anonimi, non si ha altra scelta che usare 'var'. – alimbada

+0

Sì, bene. Questo non era proprio quello che chiedevo.Ci sono molte domande riguardanti la parola chiave var. Mi chiedevo perché ero in grado di digitare nel mio IDE di Visual Studio 2008 anche se il mio progetto era destinato a .NET 2. Grazie per la risposta anche se – Patrick

+1

@Patrick, ho solo scremato la domanda ... Il titolo era "Sta usando il parola chiave var bad in C# 2.0? " e contenuto al suo interno hai chiesto "Ma quello che non capisco è, non dovresti farlo in alcuni casi?". Stavo cercando di evidenziare alcuni casi in cui non dovresti, indipendentemente dal processo di creazione. – Ian