C Sharp 4.0 - C Sharp 4.0
C # 4.0 bir versiyonu C # 11 Nisan 2010'da yayımlanan programlama dili. Microsoft 4.0'ı piyasaya sürdü Çalışma süresi ve geliştirme ortamı Visual Studio 2010.[1] C # 4.0'ın ana odak noktası, kısmen veya tamamen dinamik olarak yazılmış diller ve çerçevelerle birlikte çalışabilirliktir. Dinamik Dil Çalışma Zamanı ve COM.
Özellikleri
Aşağıdaki yeni özellikler C # 4.0'a eklenmiştir.[2]
Dinamik üye arama
Yeni bir sözde tip dinamik
C # tipi sisteme tanıtıldı. Olarak kabul edilir System.Object
, ancak buna ek olarak, herhangi bir üye erişimi (yöntem çağrısı, alan, özellik veya dizin oluşturucu erişimi veya bir temsilci çağrısı) veya bir operatörün bu tür bir değere uygulanmasına herhangi bir tür denetimi yapılmadan izin verilir ve çözümü çalıştırılana kadar ertelenir. -zaman. Bu olarak bilinir ördek yazarak. Örneğin:
// Herhangi bir nesnenin Uzunluk özelliğinin veya alanının değerini döndürür int GetLength(dinamik obj) { dönüş obj.Uzunluk; } GetLength("Selam Dünya"); // bir dizenin Uzunluk özelliği vardır, GetLength(yeni int[] { 1, 2, 3 }); // ve bir dizi de yapar GetLength(42); // ancak bir tam sayı değil - çalışma zamanında GetLength yönteminde bir istisna atılır
Dinamik yöntem çağrıları bir tür değeri tarafından tetiklenir dinamik
herhangi bir örtük veya açık parametre olarak (ve yalnızca bir alıcı değil). Örneğin:
geçersiz Yazdır(dinamik obj) { Sistem.Konsol.Yazı çizgisi(obj); // çağrılacak WriteLine () aşırı yüklemesi çalışma zamanında kararlaştırılır } Yazdır(123); // WriteLine (int) çağrısını sonlandırır Yazdır("ABC"); // WriteLine (string) 'i çağırmayı bitirir
Dinamik arama, üç farklı mekanizma kullanılarak gerçekleştirilir: COM IDispatch COM nesneleri için, IDynamicMetaObjectProvider
Bu arayüzü uygulayan nesneler için DLR arayüzü ve yansıma diğer tüm nesneler için. Bu nedenle herhangi bir C # sınıfı, örneklerinde dinamik çağrıları IDynamicMetaObjectProvider
.
Dinamik yöntem ve dizinleyici çağrıları durumunda, aşırı yük çözümlemesi çalışma zamanında bağımsız değişken olarak iletilen değerlerin gerçek türlerine göre gerçekleşir, ancak bunun dışında olağan C # aşırı yükleme çözüm kurallarına göre yapılır. Ayrıca, dinamik bir çağrıda alıcının kendisinin dinamik olmadığı durumlarda, çalışma zamanı aşırı yük çözümlemesi, yalnızca alıcının bildirilen derleme zamanı türünde açığa çıkan yöntemleri dikkate alacaktır. Örneğin:
sınıf Baz{ geçersiz Foo(çift x);}sınıf Türetilmiş : Baz{ geçersiz Foo(int x);}dinamik x = 123;Baz b = yeni Türetilmiş();b.Foo(x); // Base.Foo (double) seçer çünkü b Base türündedir ve Derived.Foo (int) açığa çıkmazdinamik b1 = b;b1.Foo(x); // Derived.Foo (int) seçer
Dinamik üye erişiminden döndürülen herhangi bir değer türünün kendisidir dinamik
. Tür değerleri dinamik
örtük olarak diğer türden ve diğer türlere dönüştürülebilir. Yukarıdaki kod örneğinde bu izin verir GetLength
bir çağrı tarafından döndürülen değeri işleme işlevi Uzunluk
herhangi bir açık atama içermeyen bir tamsayı olarak. Çalışma zamanında, gerçek değer istenen türe dönüştürülecektir.
Kovaryant ve kontravaryant jenerik tür parametreleri
Genel arabirimler ve temsilciler, tür parametrelerini şu şekilde işaretleyebilir: kovaryant veya kontravaryant anahtar kelimeleri kullanmak dışarı
ve içinde
sırasıyla. Bu bildirimler daha sonra hem örtük hem de açık tür dönüşümleri için ve hem derleme zamanı hem de çalışma zamanı için dikkate alınır. Örneğin, mevcut arayüz IEnumerable
aşağıdaki gibi yeniden tanımlandı:
arayüz IEnumerable<dışarı T>{ IEnumerator<T> GetEnumerator();}
Bu nedenle, uygulayan herhangi bir sınıf IEnumerable
bazı sınıflar için Türetilmiş
ayrıca uyumlu olduğu kabul edilir IEnumerable
tüm sınıflar ve arayüzler için Baz
o Türetilmiş
doğrudan veya dolaylı olarak genişler. Pratikte, aşağıdaki gibi kod yazmayı mümkün kılar:
geçersiz Tümünü Yazdır(IEnumerable<nesne> nesneler){ her biri için (nesne Ö içinde nesneler) { Sistem.Konsol.Yazı çizgisi(Ö); }}IEnumerable<dizi> Teller = yeni Liste<dizi>();Tümünü Yazdır(Teller); // IEnumerable örtük olarak IEnumerable 'ye dönüştürülür
Kontravans için mevcut arayüz IComparer
aşağıdaki gibi yeniden tanımlandı:
halka açık arayüz IComparer<içinde T>{ int Karşılaştırmak(T x, T y);}
Bu nedenle, uygulayan herhangi bir sınıf IComparer
bazı sınıflar için Baz
ayrıca uyumlu olduğu kabul edilir IComparer
tüm sınıflar ve arayüzler için Türetilmiş
-den uzatılan Baz
. Aşağıdaki gibi kod yazmayı mümkün kılar:
IComparer<nesne> objectComparer = GetComparer();IComparer<dizi> stringComparer = objectComparer;
COM kullanırken isteğe bağlı ref anahtar sözcüğü
ref
yöntem arayanlar için anahtar sözcük, artık tarafından sağlanan yöntemleri çağırırken isteğe bağlıdır. COM arayüzler. İmzalı bir COM yöntemi verildiğinde
geçersiz Artış(ref int x);
çağrı artık şu şekilde yazılabilir:
Artış(0); // "ref" veya bir yer tutucu değişkenine artık gerek yok
veya
int x = 0;Artış(ref x);
İsteğe bağlı parametreler ve adlandırılmış bağımsız değişkenler
C # 4.0, aşağıda görüldüğü gibi varsayılan değerlere sahip isteğe bağlı parametreleri sunar. Visual Basic ve C ++. Örneğin:
geçersiz Artış(ref int x, int dx = 1){ x += dx;}int x = 0;Artış(ref x); // dx, yöntem x == 1'i döndürdükten sonra varsayılan 1 değerini alırArtış(ref x, 2); // dx, yöntem x == 3'ü döndürdükten sonra 2 değerini alır
Ek olarak, isteğe bağlı parametreleri tamamlamak için, yöntem çağrılarında parametre adlarının açıkça belirtilmesi mümkündür, bu da programcının bir yöntem için isteğe bağlı parametrelerin herhangi bir alt kümesini seçici olarak geçirmesine izin verir. Tek kısıtlama şu ki adlandırılmış parametreler isimsiz parametrelerden sonra yerleştirilmelidir. Parametre adları hem isteğe bağlı hem de gerekli parametreler için belirtilebilir ve okunabilirliği artırmak için veya bir çağrıda bağımsız değişkenleri rastgele yeniden sıralamak için kullanılabilir. Örneğin:
Akış Açık dosya(dizi isim, FileMode mod = FileMode.Açık, FileAccess Giriş = FileAccess.Okuyun) { ... }Açık dosya("dosya.txt"); // hem "mod" hem de "erişim" için varsayılan değerleri kullanın Açık dosya("dosya.txt", mod: FileMode.Oluşturmak); // "erişim" için varsayılan değeri kullanınAçık dosya("dosya.txt", Giriş: FileAccess.Okuyun); // "mod" için varsayılan değeri kullanAçık dosya(isim: "dosya.txt", Giriş: FileAccess.Okuyun, mod: FileMode.Oluşturmak); // ekstra okunabilirlik için tüm parametreleri adlandırın, // ve yöntem bildiriminden farklı sıra kullanın
İsteğe bağlı parametreler, COM ile birlikte çalışmayı kolaylaştırır. Önceden C #, isteğe bağlı olanlar da dahil, COM bileşeninin yöntemindeki her parametreyi geçirmek zorundaydı. Örneğin:
nesne dosya adı = "Test.docx";nesne eksik = Sistem.Yansıma.Eksik.Değer;belge.Farklı kaydet(ref dosya adı, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik, ref eksik);
İsteğe bağlı parametreler desteği ile kod şu şekilde kısaltılabilir:
belge.Farklı kaydet(ref dosya adı);
Şimdi isteğe bağlı olduğu için ref
COM kullanırken anahtar kelime, daha da kısaltılabilir
belge.Farklı kaydet(dosya adı);
Dizine eklenen özellikler
COM nesnelerinin dizine alınmış özellikleri (ve varsayılan özellikleri) artık tanınmaktadır, ancak C # nesneleri hala bunları desteklememektedir.
Referanslar
- ^ "Microsoft Visual Studio 2010 İlk Bakış".
- ^ Torgersen, Mads (2008-10-27). "C # 4.0'daki yeni özellikler". Microsoft. Alındı 2008-10-28.