2010-08-25 17 views
6

Jak zrozumieć poniższy kod? Co oznacza "to" w prototypie funkcji ogólnej? Dzięki!C# funkcja ogólna pytanie

public static class MyExtensions 
{ 
    public static MyStream<T> MySingle<T>(this T source) 
    { 
     return new MyStream<T>(source); 
    } 
} 

Odpowiedz

7

że jest to extension method, że staje się ważna metoda wszystkich obiektów typu T.

To nie ma nic wspólnego z rodzajowych.

+3

Dobra uwaga na temat tego słowa kluczowego "this" niezwiązanego z rodzajami. – Oded

16

this w tym kontekście oznacza, że ​​jest to metoda rozszerzenie tak można użyć to "normalny" sposób:

MyExtensions.MySingle(someSource)

czy to (czasem ładniejszy) sposób:

someSource.MySingle()

Jest to możliwe tylko wtedy, gdy metoda jest static i jest w klasie static. Nie ma to również nic wspólnego z ogólnym aspektem metody - możesz tworzyć metody rozszerzania bez aspektów ogólnych, a przed parametrem nadal masz this.

Metody rozszerzania, jak sugeruje nazwa, są używane do rozszerzenia istniejących klas metodami, jeśli nie masz dostępu do źródła lub jeśli chcesz, aby był używany w szerokim zestawie klas. Ważne jest, aby pamiętać, że nie masz dostępu do prywatnych i chronionych metod itp., Np. Kiedy czerpiesz z klasy, kiedy tworzysz metodę rozszerzenia na typie.

Również dla wyjaśnienia dogłębnej:

Extension Methods (C# Programming Guide)

1

Jest to metoda rozszerzenie, this jest przypadek, że metoda jest stosowana do.

0

Wskazuje to, że jest to metoda rozszerzenia. Rozszerzany typ to "T". Wszystkie wystąpienia "T" będą miały metodę MySingle.

2

MySingle<T> jest zdefiniowany jako extension method (MSDN).

To oznacza, że ​​w użyciu można nazwać tak:

MyStream<string> stringStream = "a string".MySingle(); 

ta jest identyczna nazywając go „standardowego” sposób:

MyExtensions.MySingle("a string"); 

Kiedy nazywają to pierwszy sposób (jako metoda rozszerzenia) element, na który jest wywoływany, jest przekazywany jako pierwszy parametr. Typ pierwszego parametru określa zatem typ, w którym można wywołać metodę rozszerzenia, ale ponieważ mamy otwarty typ ogólny, można go wywołać na dowolnym obiekcie.

Aby zdefiniować metodę rozszerzenia, klasa zawierająca i sama metoda muszą zostać zadeklarowane jako static.

Metody rozszerzeń zostały dodane w C# 3.0 i VB 9.0.

1

Tak, jest to metoda rozszerzenia, ale o ile rozumiem, pyta także, co to znaczy, używając T (rodzajowa definicja typu) z "tym" słowem kluczowym w sygnaturze metody.

Oznacza to, że metoda przedłużania będzie prawidłową metodą dla wszystkich obiektów każdej klasy i typów konstrukcji w projekcie.