Karmaşık yöntemler, olaylar ve yapıcılar gibi karmaşık sınıfları tanımlamak istemediğimizde, dinamik olarak özel bir veri tipi -> anonim tip üretebiliriz.
1. Anonimlik türünü tanımlayın
Anonim bir tür tanımlarken, var anahtar kelimesini ve nesne başlatma sözdizimi kullanmanız gerekir.
var: Derleyici, derleme zamanında otomatik olarak yeni bir sınıf tanımı üretir (C# kodunda sınıfın adını göremeyiz).
Başlatma: Derleyiciye, yeni oluşturulan tür için özel arka plan alanları ve (yalnızca okunabilir) özellikler oluşturmasını söyler.
Parametreleri geçirerek anonim bir tür oluşturun ve ilgili bilgileri yazdırın
Çağrı: Anonim tipler ayrıca sabit kod kullanılarak da oluşturulabilir
2. Anonim tiplerin iç temsili
Tüm anonim tipler otomatik olarak Object'ten miras alır, bu yüzden car nesnesinde ToString, GetHashCode, Equals kullanabiliriz, şunu deneriz:
Çağrılar ve sonuçlar:
Araba nesnesinin türü: <>f__AnonymousType03 (sizinki farklı olabilir), anonim tip adı derleyici tarafından hissedilir, müdahale edemeyiz, CIL kodu.
3. ToString() ve GetHashCode() yöntemlerinin uygulanması.
1.ToString()
2.GetHashCode()
Her anonim tipin değişkenini kullanarak System.Collections.Generic.EqualityComparer türü girişi olarak hash değerini hesaplar ve yalnızca <T>iki anonim tip aynı özelliklere sahip ve aynı değer verildiğinde aynı hash değerini üretir.
4. Anonim tiplerin eşit anlamanlamı
Eşit()
Sonuçları analiz edin:
1. Equals(): Derleyici, değer anlamına göre nesnelerin eşit olduğunu belirlemek için Equals()'yı geçersiz eder (örneğin, iki nesnenin her veri üyesinin değerini not eder)
2. == Operatörler: Anonim tipler eşdeğer operatörleri (== , !=) aşırı yüklemediği için, == içerik değil, referansları karşılaştırır.
3. GetType(): Çünkü aynı montajda iki aynı (aynı niteliklere sahip) anonim tip ilan edersek, derleyici yalnızca bir anonim tipin tanımını üretir.
5. Anonim tipler içeren anonim tipler
Özet:
Aslında, özellikle LINQ kullanırken anonim tipleri kullanmaya dikkat etmeli ve anonim tiplerin ortaya çıkması nedeniyle güçlü tipli sınıflar veya yapılar kullanmaktan asla vazgeçmemeliyiz.
Aslında, anonim tipin kendisinin birçok sınırlaması vardır:
- Anonim tipin adını kontrol edemezsiniz
- Anonim tipler System.Object'i devralır
- Anonim türde alan ve öznitelikler her zaman sadece okunur (only read) geçerlidir
- Anonim türler olayları, özel yöntemleri, özel operatörleri ve özel yeniden yazmaları desteklemez
- Anonim tipler örtük mühürlenir
- Anonim tiplerin varlık oluşturulması yalnızca varsayılan yapıcı kullanır
Bir varlığın şeklini işlevini tanımlamadan hızlıca tanımlamamız gerekiyorsa, anonim tipi kullanabiliriz. |