Łopatologiczne wytłumaczenie stosowania metod rozszerzonych C#


(Shiva) #1

Staram się pojąć ważny temat w programowaniu jakim są metody rozszerzone w C#, ale za nic nie umiem tego załapać. Jak dla mnie skomplikowanie opisują to na stronach które przeglądałem, czy ktoś mógłby mi to spróbować łopatologicznie opisać, jak to stosować? Teorie ogarniam, wiem w jakim celu to stosować - kiedy nie chce ingerować (lub nie mam dostępu) do jakiejś gotowej klasy. 


(kowgli) #2

Nie jest to żadna wielka filozofia. Możesz w ten sposób rozszerzać istniejące typy, do których najczęściej nie masz kodu źródłowego.

 

Powiedzmy, że masz wbudowaną klasę String i chciałbyś mieć metodą dodającą kropkę na końcu napisu.

 

Możesz napisać po prostu własną metodę:

string DodajKropke(string s)
{
   return s + ".";
}

i użyć jej w taki sposób

string s = "Ala ma kota";
string s2 = DodajKropke(s); // s2 = "Ala ma kota."

Nie ma w takim podejściu oczywiście nic złego, ale gdybyś chciał używać swojej metody DodajKropke analogicznie do “wbudowanych” metod w klasę String, musisz użyć metody rozszerzającej (czyli “dodającej” się do wbudowanych metod danej klasy). 

 

public static string DodajKropke(this String s)
{
   return s + ".";
}

Użyjesz jej wtedy tak:

string s = "Ala ma kota";
string s2 = s.DodajKropke(); // s2 = "Ala ma kota."

Nie jest to nic wielkiego. Taki “syntactic sugar”. 

 

Bardziej życiowy przykład. Chcesz mieć metodę, która formatuje liczbę typu decimal to reprezentacji jako złotówki, w polskim formatowaniu.

123.3400000000  -> “123,34 zł”

 

Dodajesz metodę rozszerzającą:

public static class ExtensionMethods
{
    public static string ToPLN(this decimal value)
    {
         return value.ToString("N2", new System.Globalization.CultureInfo("pl-PL")) + " zł";
    }
}

i używasz w taki sposób:

class Program
{
    static void Main(string[] args)
    {
         decimal value = 10M;
         Console.WriteLine(value.ToPLN()); // Wypisze "10,00 zł"
     }        
}

(Shiva) #3

Masakra mózg mi się pali przy analizowaniu tego, ale chyba wreszcie załapałem :smiley:


(kowgli) #4

 

Nie za bardzo widzę związek między propertiesami, a metodami rozszerzającymi, ale może czegoś nie wiem. Podałbyś przykład?


(Shiva) #5

http://4programmers.net/C_sharp/Metody_rozszerzaj%C4%85ce


(kowgli) #6

 

To są dwie różne rzeczy zupełnie. Bez związku. 

public double Bok { get; set; }

To property (właściwość?) / akcesor. Służy do ukrycia wewnętrznych pól klasy. Można w nim również np. robić walidację.

 

W Javie napisałbyś coś takiego:

private double bok;

public double getBok() {
   return bok;
}

public void setBok(double bok) {
   this.bok = bok;
}

W C# ponieważ jest to bardziej rozwinięty język  :stuck_out_tongue: możesz:

private double bok;

public Bok
{
    get
    {
         return bok;
    }
    get
    {
         bok = value;
    }
}

//Lub krócej (bo jedyne co robisz to przypisujesz, pobierasz wartość bezpośrednio):

public Bok {get; set;}

W obu przypadkach kompilator po cichu generuje to samo co w Javie, jednak oszczędzamy trochę klepania i poprawiamy czytelność kodu. Odróżniamy też wyraźnie składniowo metody (które coś robią) od właściwości (które jedynie pobierają/ustawiają jakąś wartość). Właściwości składiowo używamy jak zmiennych.

 

Używamy też:

mojObiekt.Bok = 123.;
double bok = mojObiekt.Bok;

zamiast Javowego:

mojObiekt.setBok(123.);
double bok = mojObiekt.getBok();

“Wyższa szkoła jazdy”

public Bok { get; private set; }

Z zewnątrz klasy możesz pobrać wartość boku, ale nie możesz jej ustawić.

 

Tak na marginesie zamiast tutoriali z internetu polecam jednak jakąś dobrą książkę. Może być w PDF. Przeważnie jednak coś co jest wydane ma wyższą jakość od pisanych przez amatorów wpisów. Jest też lepiej metodycznie uporządkowane.

http://www.amazon.com/s/ref=sr_nr_p_72_0?fst=as%3Aoff&rh=i%3Aaps%2Ck%3Ac%23%2Cp_72%3A2661618011&keywords=c%23&ie=UTF8&qid=1440675955&rnid=2661617011


(Shiva) #7

To co napisałeś na temat {get; set;} to wiem myślałem, że po prostu jakoś konkretnie się to wykorzystuje w rozszerzaniu metod.

 

Jakieś tam podstawy mam i czytam książkę: http://helion.pl/ksiazki/asp-net-mvc-4-zaawansowane-programowanie-adam-freeman-steven-sanderson,aspmv4.htm

Ale faktycznie czasami niektóre rzeczy nie są tam wytłumaczone i wtedy muszę posiłkować się wiedzą z internetu. Bo jest to stricte MVC. Jakąś konkretną ksiązkę C# w języku polskim możesz polecić? Jak już mówiłem trochę wiedzy C# nabyłem więc raczej bym z niej korzystał na zasadzie jak nie znam konkretnego tematu zawarte w książce z MVC to bym tam starał sie douczyć.


(kowgli) #8

 

Niestety nie jestem na bieżąco w kwestii książek. Na marginesie polskich technicznych w ogóle nie lubię bo są koślawo tłumaczone, lub jeśli w oryginale, to po angielsku zawsze znajdzie się lepszą. Jak dla mnie językiem informatyki jest angielski i tyle…

 

Poszukaj może polskich wersji tych książek, które mają dobre opinie na amazonie. 

 

Warto chyba jednak poznać podstawy samego języka (metodycznie) zanim zacznie się poznawać zbudowane na nim technologie. Moim zdaniem takie wyrywkowe czytanie jest dobre, ale jeśli już dobrze znamy jakiś temat. Ucząc się od początku książka jest jednak niezastąpiona.