SORU
15 HAZİRAN 2010, Salı


"bu" fonksiyonu parametre olarak

HtmlHelpers için bazı kod örnekleri bakıyor, ve benzeyen bildirimleri görüyorum

public static string HelperName(this HtmlHelper htmlHelper, ...more regular params )

Başka yerde inşa herhangi bu tür gördüğümü hatırlamıyorum ama birinin amacı açıklayabilir "bu"? Bir şey bildirerek public static sınıf örneği gerek yoktu sandım - ne demek "bu" bu durumda?

CEVAP
15 HAZİRAN 2010, Salı


Bu uzatma yöntemleri bildirmek için sözdizimi, C, yeni bir özelliği# 3.0.

Bir uzantı yöntemi bölüm kodu, bölüm derleyici "büyü", burada derleyici yardımıyla ıntellisense Visual Studio hale görünen uzantısı yöntemdir aslında kullanılabilir bir örnek yöntemi nesne soru.

Bana bir örnek vereyim.

GobbleGobble adlı String sınıfını yöntem yok, uzantısı bir yöntem oluşturmak ne işi var?"

public static class StringExtensions
{
    public static void GobbleGobble(this string s)
    {
        Console.Out.WriteLine("Gobble Gobble, "   s);
    }
}

Sınıf adı sadece benim adlandırma kuralı budur, gerekli böyle bir isim değil, ama yöntemi gibi statik olmalı.

Yukarıdaki yöntem ilanından sonra, Visual Studio, bu yazabilirsiniz:

String s = "Turkey Baster!";
s.

nokta sonra, ıntellisense için bekleyin ve orada GobbleGobble bir yöntem, bu kodu tam olduğuna dikkat edin:

String s = "Turkey Baster!";
s.GobbleGobble();

Önemli: Uzatma yöntemi olduğu bildirildi sınıf ıntellisense yöntem göstermek için derleyici için ıntellisense işlemci için kullanılabilir olması gerekir. Senin yazın el GobbleGobble ve kullanınCtrl.kısayol, sağ dosyasına yönergeleri kullanarak yardımcı olacaktır.

Bu yöntem için parametre kayboldu dikkat edin. Derleyici sessizce olan önemli bit, etrafında hareket edecek:

String s = "Turkey Baster!";
s.GobbleGobble();
^     ^
|      -- the compiler will find this in the StringExtensions class
|
 -- will be used as the first parameter to the method

Bu nedenle, yukarıdaki kodu bu derleyici tarafından dönüştürülmüş olacak:

String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);

Çağrı zamanda, hiçbir sihirli yoktur, sadece statik bir yöntem çağrısı.

Eğer uzatma yöntemi daha bir parametre daha ilan etmesi halinde, sadece ilk this değiştirici desteklediğini unutmayın, gerisi yönteminin bir parçası olarak normal bir çağrı olarak belirtilmesi gerekir:

public static void GobbleGobble(this string value, string extra)
{                                            |              |
    ...                                      |              |
}                                            |              |
                                             |              |
 --------------------------------------------               |
|                                                           |
v                                                           |
s.GobbleGobble("extra goes here");                          |
                        ^                                   |
                        |                                   |
                         ----------------------------------- 

Uzatma yöntemleri eklendi parçası nedeniyle bu Seri, Seri sözdizimi C# olacak bakmak için uygun bir isim uzatma yöntemleri için nesneleri oynamak anlamına gelir "takdim" Seri-destek herhangi bir tür sınıf tarafından sadece bildirme hakkı uzatma yöntemleri. Tabii ki, tam Seri Destek bir sürü iş, ama mümkün.

Ayrıca, kendileri tarafından uzatma yöntemleri gerçekten yararlı, bu yüzden bu konuda.

İşte birkaç bağlantılar:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • pilslajt

    pilslajt

    20 HAZİRAN 2008