Natknąłem się na kilka wystąpień kodu C #, takich jak:
public static int Foo(this MyClass arg)
W tym przypadku nie udało mi się znaleźć wyjaśnienia tego this
słowa kluczowego. Jakieś spostrzeżenia?
Natknąłem się na kilka wystąpień kodu C #, takich jak:
public static int Foo(this MyClass arg)
W tym przypadku nie udało mi się znaleźć wyjaśnienia tego this
słowa kluczowego. Jakieś spostrzeżenia?
Odpowiedzi:
To jest metoda rozszerzenia . Zobacz tutaj wyjaśnienie .
Metody rozszerzeń pozwalają programistom dodawać nowe metody do zamówienia publicznego istniejącego typu CLR, bez konieczności dzielenia go na klasy lub ponownej kompilacji typu pierwotnego. Metody rozszerzeń pomagają łączyć elastyczność obsługi „typowania kaczego”, popularną obecnie w dynamicznych językach, z wydajnością i sprawdzaniem poprawności w przypadku języków silnie typowanych w czasie kompilacji.
Metody rozszerzeń umożliwiają szereg przydatnych scenariuszy i pomagają stworzyć naprawdę potężną strukturę zapytań LINQ ...
oznacza to, że możesz zadzwonić
MyClass myClass = new MyClass();
int i = myClass.Foo();
zamiast
MyClass myClass = new MyClass();
int i = Foo(myClass);
Pozwala to na budowę płynnych interfejsów, jak podano poniżej.
Cytowany post na blogu Scott Gu ładnie to wyjaśnia.
Dla mnie odpowiedź na pytanie znajduje się w następującym stwierdzeniu w tym poście:
Zwróć uwagę, że powyższa metoda statyczna ma słowo kluczowe „this” przed argumentem pierwszego parametru typu string. Mówi to kompilatorowi, że tę konkretną metodę rozszerzenia należy dodać do obiektów typu „string”. W ramach implementacji metody IsValidEmailAddress () mogę następnie uzyskać dostęp do wszystkich publicznych właściwości / metod / zdarzeń faktycznego ciągu znaków, w którym metoda jest wywoływana, i zwracać wartość prawda / fałsz w zależności od tego, czy jest to poprawny adres e-mail, czy nie.
this
słowa kluczowego w podpisie metody. Inne odpowiedzi tylko nieprzydatnie mówią „to metoda rozszerzenia”. Nigdy w pełni nie rozumiałem, w jaki sposób metody rozszerzeń „przyczepiają się” do typów, które rozszerzają, aż do przeczytania tej odpowiedzi. Dziękuję Ci!
Oprócz objaśnienia Preet Sangha:
Intellisense wyświetla metody rozszerzenia za pomocą niebieskiej strzałki (np. Przed „Aggregate <>”):
Potrzebujesz
using the.namespace.of.the.static.class.with.the.extension.methods;
aby pojawiły się i były dostępne metody rozszerzenia, jeśli są w innej przestrzeni nazw niż kod, który ich używa.
Są to metody rozszerzenia . Witamy w zupełnie nowym, płynnym świecie . :)
Właśnie tego nauczyłem się innego dnia: to słowo kluczowe określa, że metoda jest rozszerzeniem klasy, która ją kontynuuje. Na przykład, MyClass będzie miał nową metodę rozszerzenia o nazwie Foo (która nie akceptuje żadnego parametru i zwraca wartość int; może być używana jak w przypadku każdej innej metody publicznej).
„this” rozszerza następną klasę na liście parametrów
Tak więc w podpisie metody poniżej „ten” rozszerza „Ciąg”. Linia jest przekazywana do funkcji jako normalny argument metody. publiczny ciąg statyczny [] SplitCsvLine (ta linia ciąg)
W powyższym przykładzie klasa „ta” rozszerza wbudowaną klasę „String”.