2012-10-05 32 views
6

Mentre passa attraverso la documentazione di ASP.NET MVC che vedo questo idioma in uso un sacco:nuova parola chiave, senza nome di classe in C#

new { foo = "bar", baz = "foo" } 

È questo una sintassi letterale dizionario? È una nuova classe/struct con il tipo dedotto dalla definizione della funzione chiamata? Se è così che i vars non hanno bisogno di una definizione di tipo, nemmeno var?

risposta

10

Questo è un tipo anonimo.

tipi anonimi forniscono un modo conveniente per incapsulare un insieme di proprietà sola lettura in un unico oggetto senza dover esplicitamente definire un primo tipo. Il nome del tipo è generato dal compilatore ed è non disponibile a livello di codice sorgente. Il tipo di ciascuna proprietà è dedotto dal compilatore.

http://msdn.microsoft.com/en-us/library/bb397696.aspx

  • tipi anonimi sono fortemente tipizzati. Dal punto di vista del Common Language Runtime, un tipo anonimo non è diverso da qualsiasi altro tipo di riferimento.

  • Se due o più tipi anonimi nello stesso assieme hanno lo stesso numero e tipo di proprietà, nello stesso ordine, il compilatore li considera come lo stesso tipo. Condividono le stesse informazioni sul tipo generato dal compilatore.

  • I tipi anonimi non devono essere trasmessi tra gli assembly o anche come return values dai metodi (possibile, ma raramente, raramente consigliabile).

  • I tipi anonimi sono un meccanismo di convenienza, ad es. quando si lavora con LINQ, come ad esempio il seguente projection:

LINQ Esempio

var result = myEnumerable.Select(o => new { foo = o.Foo, bar = o.Bar }); 
// "result" is an enumerable of a new anonymous type containing two properties 

Altre domande

Si tratta di una sintassi letterale dizionario?

No, anche se ci sono molte somiglianze. ASP .Net MVC utilizza RouteValueDictionary e tipi anonimi per rappresentare le stesse informazioni in molti overload di metodi.

come mai i vars non hanno bisogno di una definizione di tipo, nemmeno var?

tipi di valore sono dedotto, anche se l'inferenza non è sempre possibile: http://msdn.microsoft.com/en-us/library/bb531357.aspx (versione VB, se qualcuno conosce l'URL del C# equivalente aggiorna)

+0

Ottima risposta. Grazie! – improv32

4

Questo è un anonymous type syntax. Il nome del tipo è generato dal compilatore e non è disponibile a livello di codice sorgente. Il tipo di ogni proprietà è dedotto dal compilatore.

2

Questo è tipo anonimo. Ciò significa che restituisce qualcosa che ha una proprietà foo, una proprietà baz sia di tipo stringa.