C # Metode de extensie Arhitectura Întrebare

voturi
4

Am întrebat recent această întrebare: compilatorul eroare corelarea C Metoda # extensie personalizată

Marc Gravell răspuns a fost perfect și a rezolvat problema mea. Dar mi-a dat ceva să se gândească la ...

Dacă și metoda de prelungire trebuie să fie plasat pe o clasa statică și metoda în sine trebuie să fie static, de ce nu putem crea o metodă de extensie statică?

Am înțeles că parametrul marcat ca fiind „acest lucru“ va fi folosit pentru a permite accesul la o instanță a obiectului extindem. Ceea ce nu înțeleg este de ce nu poate fi o metodă creată pentru a fi statice ... se pare că doar pentru mine că aceasta este o limitare lipsită de sens ...

Întrebarea mea este: De ce nu putem crea o metodă de extensie care va funcționa ca o metodă statică?

Întrebat 12/03/2009 la 13:27
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
3

Deoarece această caracteristică nu există în C #.

Ca soluție alternativă, metodele statice pot fi implementate într-o altă clasă și numit prin acea clasă pentru a oferi funcționalitatea adăugată.

De exemplu, XNA are o MathHelper de clasă , care în mod ideal ar fi fost extensii statice la matematica clasa.

Comunitatea se întreabă dacă ne gândim că este o idee bună pentru C # 4.0

Publicat 12/03/2009 la 13:32
sursa de către utilizator

voturi
7

Mă aștept răspunsul real este pur și simplu: nu a fost un bun exemplu de utilizare. Pentru cazuri, avantajul este acela că permite o fluente API asupra tipurilor existente (care nu se furnizează logica) - și anume

var foo = data.Where(x=>x.IsActive).OrderBy(x=>x.Price).First();

care permite LINQ:

var foo = (from x in data
           where x.IsActive
           order by x.Price
           select x).First();

Cu metode statice, acest lucru pur și simplu nu este o problemă, astfel încât nu există nici o justificare; doar utiliza metoda statică pe al doilea tip.

Așa cum este, metodele de extensie nu sunt corect obiect orientate - ele sunt un abuz pragmatic pentru a face viața mai ușoară în detrimentul purității. Nu a fost nici un motiv pentru a dilua metode statice în același mod.

Publicat 12/03/2009 la 13:33
sursa de către utilizator

voturi
0

Mai întâi de toate ar trebui să adăugați încă o altă sintaxă pentru a indica faptul că doriți să extindă metodele statice de tip existent. Când se extinde sintaxa într-adevăr nevoie de un motiv foarte bun pentru a face acest lucru.

Permite imagina am o clasă numită MyExts care-mi permite să adăugați metode de extensie la Clasa_Mea. De ce ar fi: -

MyClass.DoSomethingExtra();

să fie mai bine decât

MyExts.DoSomethingExtra();

?

Publicat 12/03/2009 la 13:34
sursa de către utilizator

voturi
1

Gândirea mea ar fi pentru compatibilitate - dacă ați făcut dintr-o dată toate metodele statice de extensie metode cu necesitatea ca acest operator ar putea rupe din greșeală codul care acum primează o metodă normală cu o metodă de prelungire.

Acest parametru permite controlul și, astfel, nu se rupe compatibilitatea.

Doar o idee, totuși.

Publicat 12/03/2009 la 13:45
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more