Jenis anonim (Panduan Pemrograman C#)

Jenis anonim menyediakan cara mudah untuk merangkum sekumpulan properti baca-saja ke dalam satu objek tanpa menentukan jenis bernama terlebih dahulu. Pengkompilasi menghasilkan nama jenis pada waktu kompilasi yang tidak dapat Anda akses di kode sumber Anda. Pengkompilasi menyimpulkan jenis setiap properti.

Buat jenis anonim dengan menggunakan new operator bersama dengan penginisialisasi objek. Contoh berikut menunjukkan jenis anonim yang diinisialisasi dengan dua properti, Name dan Age:

var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// Output:
// Alice is 30 years old.

Nama properti yang diinferensikan

Anda dapat menentukan nama properti secara eksplisit dengan menggunakan sintaks.Name = value Saat Anda menginisialisasi jenis anonim dengan variabel atau ekspresi akses anggota, pengompilasi menyimpulkan nama properti dari ekspresi tersebut:

string productName = "Laptop";
decimal price = 999.99m;
var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// Output:
// Laptop: $999.99

Dalam contoh sebelumnya, pengkompilasi menyimpulkan productName dan price sebagai nama properti dari nama variabel yang digunakan dalam penginisialisasi.

Mendeklarasikan jenis anonim dengan var

Karena compiler menghasilkan nama jenis dan Anda tidak dapat mengaksesnya dalam kode sumber, Anda harus menggunakan var untuk mendeklarasikan variabel lokal. Anda tidak dapat menentukan nama jenis secara eksplisit:

// You must use var — you can't write a named type here.
var person = new { Name = "Alice", Age = 30 };

Menggunakan jenis anonim dalam kueri LINQ

Jenis anonim paling sering muncul dalam select klausa ekspresi kueri, memproyeksikan subset properti dari setiap elemen sumber.

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.

Kesetaraan

Dua instans jenis anonim yang memiliki nama dan jenis properti yang sama dalam urutan yang sama berbagi jenis yang dihasilkan kompilator yang sama. Pengkompilasi mengambil alih Equals dan GetHashCode sehingga kesetaraan membandingkan nilai properti daripada identitas referensi:

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

Jenis anonim berlapis

Jenis anonim dapat memuat jenis anonim lainnya sebagai nilai properti:

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

Karakteristik

Jenis anonim memiliki karakteristik berikut:

  • Pengkompilasi menghasilkannya sebagai internal sealed class jenis yang berasal dari Object.
  • Semua properti adalah public dan hanya-baca.
  • Tipe anonim mendukung with ekspresi untuk mutasi nondestruktif.
  • Pengkompilasi menghasilkan penimpaan berbasis nilai Equals, GetHashCode, dan ToString.
  • Jenis anonim mendukung pohon ekspresi, sedangkan tupel tidak.

Keterbatasan

Jenis anonim memiliki beberapa batasan:

  • Anda tidak dapat menggunakannya sebagai jenis pengembalian metode, parameter metode, atau jenis bidang karena Anda tidak dapat memberi nama jenisnya.
  • Mereka tercakup dalam metode di mana Anda mendeklarasikannya.
  • Anda tidak dapat menambahkan metode, peristiwa, atau operator kustom.
  • Properti selalu baca-saja; jenis anonim tidak mendukung properti yang dapat diubah.

Kapan menggunakan tuple sebagai gantinya

Untuk sebagian besar kode baru, pertimbangkan menggunakan tuples daripada tipe anonim. Sebagai tipe nilai, tuple memberikan performa yang lebih baik. Mereka juga memberikan dukungan dekonstruksi dan sintaks yang lebih fleksibel. Jenis anonim tetap menjadi pilihan yang lebih baik ketika Anda memerlukan dukungan pohon ekspresi atau semantik jenis referensi. Untuk perbandingan terperinci, dapat dilihat pada Memilih antara jenis anonim dan tipe tuple.

Baca juga