Névtelen típusok (C# programozási útmutató)

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.

Lásd még