Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A névtelen típusok kényelmes módot nyújtanak arra, hogy egyetlen objektumba foglalja egy halmaz írásvédett tulajdonságait anélkül, hogy előbb egy nevesített típust határozzunk meg. A fordító a fordításkor létrehoz egy típusnevet, amelyet nem tud elérni a forráskódban. A fordító következtet a tulajdonságok típusára.
Névtelen típusokat hozhat létre az new operátor és egy objektum inicializáló használatával. Az alábbi példa egy névtelen típust mutat be, amely két tulajdonsággal van inicializálva, Name és Age:
var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// Output:
// Alice is 30 years old.
Következtetett tulajdonságnevek
A szintaxis használatával explicit módon megadhatja a Name = value tulajdonságneveket. Amikor egy névtelen típust inicializál egy változó- vagy taghozzáférési kifejezéssel, a fordító a tulajdonság nevét ebből a kifejezésből következteti:
string productName = "Laptop";
decimal price = 999.99m;
var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// Output:
// Laptop: $999.99
Az előző példában a fordító az inicializálóban használt változónevekből következtet úgy, hogy productName és price tulajdonságnevekké válnak.
Névtelen típusok deklarálása var használatával
Mivel a fordító létrehozza a típusnevet, és nem tudja elérni a forráskódban, a helyi változó deklarálásához kell használnia var . A típusnevet nem adhatja meg explicit módon:
// You must use var — you can't write a named type here.
var person = new { Name = "Alice", Age = 30 };
Névtelen típusok használata LINQ-lekérdezésekben
A névtelen típusok leggyakrabban egy select lekérdezési kifejezés záradékában jelennek meg, ahol az egyes forráselemek tulajdonságainak egy részhalmazát vetik ki:
var words = new[] { "apple", "blueberry", "cherry" };
var results = words.Select(w => new { Word = w, Length = w.Length });
foreach (var item in results)
{
Console.WriteLine($"{item.Word} has {item.Length} letters.");
}
// Output:
// apple has 5 letters.
// blueberry has 9 letters.
// cherry has 6 letters.
Egyenlőség
Két névtelen típuspéldány, amelyek azonos tulajdonságnevekkel és típusokkal ugyanabban a sorrendben rendelkeznek, ugyanazzal a fordító által létrehozott típussal osztoznak. A fordító felülbírálja a tulajdonságértékeket Equals , és GetHashCode így az egyenlőség a hivatkozási identitás helyett a tulajdonságértékeket hasonlítja össze:
var a = new { Name = "Alice", Age = 30 };
var b = new { Name = "Alice", Age = 30 };
var c = new { Name = "Bob", Age = 25 };
Console.WriteLine(a.Equals(b)); // True
Console.WriteLine(a.Equals(c)); // False
Beágyazott névtelen típusok
A névtelen típusok tulajdonságértékként más névtelen típusokat is tartalmazhatnak:
var order = new
{
OrderId = 1,
Customer = new { Name = "Alice", City = "Seattle" },
Total = 150.00m
};
Console.WriteLine($"Order {order.OrderId} for {order.Customer.Name} in {order.Customer.City}");
// Output:
// Order 1 for Alice in Seattle
Jellemzők
A névtelen típusok a következő jellemzőkkel rendelkeznek:
- A fordító olyan típusokként hozza létre őket
internal sealed class, amelyek Object-ből származnak. - Az összes tulajdonság
publicés írásvédett. - A névtelen típusok támogatják a nem destruktív mutációk kifejezéseit
with. - A fordító értékalapú Equals, GetHashCodeés ToString felülbírálásokat hoz létre.
- A névtelen típusok támogatják a kifejezésfákat, míg a tuples nem.
Korlátozások
A névtelen típusoknak számos korlátozásuk van:
- Nem használhatja őket metódus-visszaadási típusokként, metódusparaméterekként vagy mezőtípusokként, mert nem nevezheti el a típust.
- Ezek hatóköre a deklarált metódusra van korlátozva.
- Metódusok, események és egyéni operátorok nem vehetők fel.
- A tulajdonságok mindig írásvédettek; A névtelen típusok nem támogatják a módosítható tulajdonságokat.
Mikor érdemes inkább a tuplákat használni?
A legtöbb új kód esetében fontolja meg a névtelen típusok helyett a tuplák használatát. Értéktípusokként a csuplok jobb teljesítményt nyújtanak. Emellett destrukciós támogatást és rugalmasabb szintaxist is biztosítanak. A névtelen típusok továbbra is a jobb választás, ha kifejezésfa-támogatásra vagy referencia típusú szemantikára van szüksége. Részletes összehasonlításért lásd: névtelen és tuple típusok közötti választás.