2013-05-23 24 views
16

Sanırım bu daha çok bir çerçeve tasarım sorusu. Geçenlerde, System.Array'daki yöntemlerin çoğunun neden statik olduğunu merak ettim. Bağırsak reaksiyonum her zaman örn. Array örneğinde IndexOf (object), System.Array.IndexOf (dizi, nesne) olarak değil. Kararın arkasında bir yöntem mi var, yoksa bir yöntem mi statik mi yapılmalı? Neden çoğu System.Array yöntemi statik?

Bu soruyu bulundu: When is it best to use Static Functions in ASP.NET

Ama beni tatmin etmedi: -/

+2

(ASP.NET etiketini kaldırdım çünkü Array türünün tasarımı ASP.NET ile ilgili değil) –

+0

Yalnızca diziler ve uzantı yöntemleri için kullanılmadığı için bunların çoğunun statik olduğunu şart koştum o zaman icat edildi. – Romoku

+1

@Romoku yine de örnek yöntemler olabilir, ancak –

cevap

1

Eğer System.Array arasında miras çoğu zaman tek bir boyut dizisi kullanıyor. gibi:

int[] a1 = new int[2]; 

Eğer int[] tanımlamak bu örtük @Sergey Rybalkin gibi System.Array türünden türetilmiş diyor. Bu durumda IndexOf yöntemi kesinlikle bir yöntem olarak statik yöntem olarak değil, en iyi şekilde uygulanacaktır.

Ancak System.Array öğesinden çok boyutlu diziler gibi miras alan başka türler de var. Bu durumda (çoklu boyut) IndexOf yöntemi mantıklı değildir.

Testi bu:

int[,] arr = new int[2, 2]; 

arr[0, 0] = 3; arr[1, 0] = 4; 
arr[0, 1] = 5; arr[1, 1] = 6; 

Array.IndexOf(arr, 4); 

gibi son çünkü bu yöntem statik olarak uygulandığını arasında, büyük olasılıkla Belki mesajın "Only single dimension arrays are supported here."

ile RankException atar ve. Yorumlarınız Is there a main principle behind the decision, whether to make a method static or not?

Hakkında

...

vardır ve prensip oldukça basit. Örnek yöntem, bir nesnenin bir eylemini veya davranışını temsil eder. Statik yöntem, sınıfla ilişkili mantıksal sistemin bir işlevi veya bazı durumlarda sınıfın bir örneğini oluşturmadan çağırmak istediğiniz bir yöntemdir.

Eğer örnek matematik Eğer Sqrt veya Pow gibi bir yöntem çağırmak istediğiniz her zaman gerekiyorsa karmaşa nasıl olacağını System.Math sınıfta düşünüyorsunuz?

Size vereceğim son örnek, System.Text.RegularExpressions.Regex sınıfıdır. Bu sınıf, örnek olarak uygulanan bir Match yöntemine ve statik olarak uygulanan bir aşırı yüke sahiptir.

Her biri farklı bir bağlamda kullanılır. Örnek, aynı deseni birden çok kez kullandığınızda kullanılır. Kalıbı, kodunuzda benzersiz bir zaman kullandığınızda statiktir.

+4

"Eğer cevap aydınlatıcı olsaydı lütfen işaretleyin ..."? :-P Hayır hayır .. Doğru cevap olarak işaretle * bu doğru cevap ise *. – Patrick

+0

Ek örneklerinizin oldukça uygun olduğunu sanmıyorum. Bu işlevler bir 'System.Math' örneğini * gerektirmediğinden,' Sqrt' veya 'System'Math'ın Pow' örnek yöntemleri gibi işlevler yapmanın hiçbir anlamı olmaz. Öte yandan, onları 'çifte' gibi çeşitli sayı türlerinde örnekleme yöntemleri düşünülebilir. Düzenli ifadeler gelince, statik yöntem IMO olmayan davetler için * daha iyi performans göstermez; sadece kodu kısaltmaya yardımcı olur. –

+0

@O. R. Mapper size doğru örnek yöntemi daha iyi performans gösterir. Metni düzelttim. –

İlgili konular