C # 'da statik yöntemler için resmi parametrelerde "this" anahtar sözcüğünün kullanımı


286

Aşağıdaki gibi C # kodu birkaç örnek rastladım:

public static int Foo(this MyClass arg)

thisBu durumda anahtar kelimenin ne anlama geldiğine ilişkin bir açıklama bulamadım . Herhangi bir görüşün var mı?


10
Kabul edilen cevaba ek olarak, C # Uzantı Yöntemleri için resmi MSDN belgelerine bakmanız gerekir .
vulcan raven

4
Genişletme yöntemleri uygundur, ancak bunları oluştururken / kullanırken dikkatli olmalıyız - kırılabilirler! Resmi MSDN belgelerindeki Genel Yönergelerden alıntı : "Genel olarak, uzantı yöntemlerini az miktarda ve yalnızca yapmanız gerektiğinde uygulamanızı öneririz. ... Kaynak kodunu değiştiremeyeceğiniz bir türü genişletmek için bir uzantı yöntemi kullanırken, türün uygulanmasındaki bir değişikliğin uzantı yönteminizin bozulmasına neden olma riskini kullanın. "
Krishna Gupta

Bu , bunun mümkün olabileceği anlamına mı geliyor ? Çünkü aradığım şey bu.
facepalm42

Yanıtlar:


274

Bu bir uzantı yöntemidir . Bir açıklama için buraya bakın .

Genişletme yöntemleri, geliştiricilerin mevcut bir CLR türünün genel sözleşmesine alt sınıflara ayırmak veya orijinal türü yeniden derlemek zorunda kalmadan yeni yöntemler eklemelerine olanak tanır. Genişletme Yöntemleri, günümüzde dinamik diller arasında popüler olan "ördek yazma" desteğinin esnekliğinin, güçlü yazılan dillerin performansı ve derleme zamanı doğrulaması ile harmanlanmasına yardımcı olur.

Genişletme Yöntemleri, çeşitli yararlı senaryolar sağlar ve gerçekten güçlü LINQ sorgu çerçevesini mümkün kılar.

arayabileceğiniz anlamına gelir

MyClass myClass = new MyClass();
int i = myClass.Foo();

ziyade

MyClass myClass = new MyClass();
int i = Foo(myClass);

Bu, aşağıda belirtildiği gibi akıcı arayüzlerin oluşturulmasına izin verir .


alt sınıflandırma zor
Gerry

@Gerry - ne demek istiyorsun?
Preet Sangha

9
Üzgünüm, küçük bir alay - bu günlerde bir çok sözdizimi sorun olduğunu bile bilmiyordum sorunları çözmek gibi görünüyor. Okunabilirlik çok yüksek bir öncelik olmalıdır.
Gerry

2
Dürüst olmak gerekirse @Gerry, klasik bir Blub Paradoksundaymışsınız gibi geliyor . Bu günlerde birçok sözdizimi, sahip olmadığınız sorunları çözüyor çünkü daha iyi bir yol olduğunu bilmiyordunuz veya bu sözdiziminin harika olduğu bir görev yapmıyorsunuz. ' Bu bir problem arayışında çözümdür ' hakkındaki çoğu yorum aslında ' bu özelliğin nasıl çalıştığını bilmiyorum, bu yüzden işe yaramaz olmalı ' örneğidir .
Myrddin Emrys

53

Scott Gu'nun alıntılanan blog yazısı bunu güzel bir şekilde açıklıyor.

Benim için sorunun cevabı bu yazıda aşağıdaki ifadede yer alıyor:

Yukarıdaki statik yöntemin, string türünün ilk parametre bağımsız değişkeninden önce nasıl "this" anahtar sözcüğüne sahip olduğuna dikkat edin. Bu derleyiciye, bu özel Uzantı Yöntemi'nin "string" türündeki nesnelere eklenmesi gerektiğini bildirir. IsValidEmailAddress () yöntemi uygulaması içinde, daha sonra yöntemin çağrıldığı gerçek dize örneğinin genel özelliklerine / yöntemlerine / olaylarına erişebilir ve geçerli bir e-posta olup olmadığına bağlı olarak true / false döndürebilirim.


9
Bu kabul edilen cevap olmalı. thisAnahtar kelimenin yöntem imzasındaki asıl amacının ne olduğunu açıklayan tek cevap budur. Diğer cevaplar sadece yararsız bir şekilde "bu bir uzantı yöntemi" diyor. Genişletme yöntemlerinin bu cevabı okuyana kadar genişlettikleri tiplere nasıl "bağlandığını" tam olarak anlamadım. Teşekkür ederim!
Lews Therin

13

Preet Sangha'nın açıklamasına ek olarak:
Intellisense, genişletme yöntemlerini mavi bir okla görüntüler (örneğin, "Toplam <>" önünde):

resim açıklamasını buraya girin

İhtiyacın var

using the.namespace.of.the.static.class.with.the.extension.methods;

uzantı yöntemlerinin görünmesi ve kullanılabilir olması için, bunları kullanan koddan farklı bir ad alanındaysa.



4

Geçen gün bunu kendim öğrendim: bu anahtar kelime, yöntemin onu ilerleyen sınıfın bir uzantısı olduğunu tanımlar. Örneğiniz için, MyClass'ın Foo adında yeni bir uzantı yöntemi olacaktır (bu, herhangi bir parametreyi kabul etmez ve bir int döndürür; diğer herkese açık yöntemlerde olduğu gibi kullanılabilir).


1

"this" parametre listesindeki bir sonraki sınıfı genişletir

Bu nedenle, "bu" altındaki yöntem imzasında "String" i genişletir. Çizgi, yönteme normal bir argüman olarak işleve iletilir. public static string [] SplitCsvLine (bu Dize satırı)

Yukarıdaki örnekte "this" sınıfı yerleşik "String" sınıfını genişletiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.