Bu, C # 'nın uzatma yöntemleri ve tasarım felsefeleri ile ilgili bir soru, bu yüzden bu soruyu cevaplamanın en iyi yolunun MSDN’nin dokümantasyonunu uzatma yöntemleri amacıyla sunmak olduğunu düşünüyorum :
Uzantı yöntemleri, yeni türetilmiş bir tür oluşturmadan, yeniden derlemeden veya orijinal türünü değiştirmeden mevcut türlere yöntemleri "eklemenizi" sağlar. Genişletme yöntemleri özel bir statik yöntemdir, ancak genişletilmiş türdeki örnek yöntemleri olarak adlandırılırlar. C #, F # ve Visual Basic ile yazılmış istemci kodu için, bir uzatma yöntemini çağırmakla ve aslında bir türde tanımlanmış yöntemler arasında belirgin bir fark yoktur.
...
Genel olarak, uzatma yöntemlerini az miktarda ve sadece gerektiğinde uygulamanızı öneririz. Mümkün olduğunda, mevcut bir türü genişletmesi gereken müşteri kodunun, mevcut türden türetilmiş yeni bir tür oluşturarak yapması gerekir. Daha fazla bilgi için, bkz. Miras.
Kaynak kodunu değiştiremeyeceğiniz bir türü genişletmek için bir uzantı yöntemi kullanırken, türün uygulanmasındaki bir değişikliğin uzantı yönteminizin bozulmasına neden olma riski vardır.
Belirli bir tür için uzatma yöntemleri uygularsanız, aşağıdaki noktaları unutmayın:
- Bir uzatma yöntemi, türünde tanımlanan bir yöntemle aynı imzaya sahipse asla çağrılmaz.
- Genişletme yöntemleri, isim alanı seviyesinde kapsam içine alınmıştır. Örneğin, adlandırılmış tek bir ad alanında uzantı yöntemleri içeren birden fazla statik sınıfınız varsa
Extensions
, tümü using Extensions;
yönergeyle kapsam içine alınacaktır .
Özetlemek gerekirse, genişletme yöntemleri, geliştiriciler bunu doğrudan yapamadığında bile, belirli bir türe örnek yöntemleri eklemek için tasarlanmıştır. Örnek yöntemler olacaktır çünkü her zaman uzatma yöntemleri geçersiz (örnek yöntemi sözdizimini kullanarak denir ise) mevcut, bu gerekip gerekmediğini sadece doğrudan bir yöntem eklemek veya sınıfını uzatamaz eğer yapılması. *
Başka bir deyişle, bir uzatma yöntemi tıpkı bir örnek yöntemi gibi davranmalıdır, çünkü bazı müşteriler tarafından bir örnek yöntemi oluşturulabilir. Ayrıca, çağrıldığı nesne olduğu takdirde bir örnek yöntemi de atmalıdır null
, uzantı yöntemi de öyle olmalıdır.
C # 3.0 kullanıma sunulduğunda, orada kullandığınız müşterilerine milyonlarca zaten: * Bir yan not olarak, bu LINQ tasarımcıları karşı karşıya olduğunu tam olarak durumdur System.Collections.IEnumerable
ve System.Collections.Generic.IEnumerable<T>
onların koleksiyonlarında ve hem de foreach
döngüler. Bu sınıflar, geri IEnumerator
, sadece iki yöntem olan nesneler Current
ve MoveNext
çok gibi herhangi bir ek gerekli örnek yöntemleri, ekleme, Count
, Any
vb müşterilerin bu milyonlarca kırılma olacaktır. Dolayısıyla, bu işlevselliği sağlamak için (özellikle nispeten kolay Current
ve MoveNext
göreceli olarak uygulanabildiği için), mevcut durumda olan herhangi birisine uygulanabilecek olan uzatma yöntemleri olarak yayınladılar.IEnumerable
örneği ve ayrıca sınıflar tarafından daha verimli bir şekilde uygulanabilir. C # 'nin tasarımcıları ilk gün LINQ’yu piyasaya sürmeye karar vermiş olsalardı, örnek metotlar olarak sağlanmışlardı IEnumerable
ve muhtemelen bu metotların varsayılan arayüz uygulamalarını sağlamak için bir tür sistem tasarlamışlardı.