2013-05-14 28 views
7

Statik yöntemleri anlamaya çalışıyorum ve kafa karıştırıcı bir noktaya ulaştım. Ben (sınıf kendisi statik değildir) benim nesnesinin bir örneğini oluşturursanız o zaman ben genellikle sadece kamuya erişimi, korumalı ve ya dahili yöntemler (kapsam/kapsülleme bağlı olması, sadece bu soru için yöntemler üzerinde yoğunlaşırkenNeden tüm özel yöntemler için statik yöntemler kullanmıyorsunuz?

). Diğer bir deyişle, özel yöntemlere erişimim yok.

Minimal rağmen, statik yöntemler hafifçe statik olmayan yöntemlere göre daha verimlidir ki okudum. , Boşluk bir dönüş türü ile özel bir yöntem oluşturarak ve kendi içinde bir nesnenin bir başvuru oluştururken hariç yaparken

Peki, neden hiç statik yapmazdım? Gördüğüm bütün kodlar bunu yapmaz, bu yüzden sadece noktayı kaçırdığımı varsayabilirim.

+3

Aynı nedenden dolayı, herşeyi "statik" yapmamalısınız, çünkü OOP'tan yararlanmak istiyorsunuz. Bu yüzden örneklere ihtiyacınız var. Özel yöntemler bile normalde bir örnekle ilgilidir. –

cevap

29

Statik yöntemler, sınıftaki statik olmayan üye verilerine erişemez.

6

Statik yöntemler genellikle durum bilgisi olmayan olmalıdır ve bu nedenle örnek durumuna erişemezler. Buna karşılık, örnek yöntemler durum bilgisi olan'dur ve bu nedenle örnek durumunu okuyabilir ve değiştirebilir. Vatansız yöntemlerden

Tipik örnekler şunlardır:

  • Fabrika Yöntemleri
  • İkili Operatörler
  • ... Tabii

, statik yöntemler olsa hep vatansız değildir, statik durumdaki yöntemlerden örnekler vardır. sınıfının devlet de olduğu için bu uygulamalar olsa biraz daha bakıma ihtiyacı

  • Singleton
  • Örnek Havuzlar
  • ...: o zaman sınıfın için tek devlet vardır süreç içindeki tüm iş parçacıkları tarafından paylaşılır.

0

Kodda gördüğünüz yöntemlerin çoğu, bir şekilde statik olmayan sınıf değişkenlerini/özelliklerini kullanır. Bu statik bir bağlamdan erişilemez. Bu, statik bir yöntem içinde, nesneye özgü olanları değil, yalnızca bu sınıfın statik üyelerine erişebileceğiniz anlamına gelir.

1

Bunu, minimal olsa da, statik yöntemlerin statik olmayan yöntemlerden biraz daha verimli olduğunu okudum. koşulsuz doğru değil

: Sadece aksi static olabilir ama yöntemleri ihmal tarafından static yapılmazsa daha verimli olacaktır.Aksi halde, nesneyi el ile bir referansa aktarmanız ve oyun alanını düzleştirmeniz gerekir. Dahası, CLR, ölçünün ölçülmesi zor olduğu kadar optimize edilmiştir.

Sorunuzu yanıtlamak için, özellik veya değişkenler aracılığıyla örnek durumuna erişemediğinde, statik olmayan bir yöntem yapmak için bir neden yoktur. Ancak, örnek başına duruma erişen tüm yöntemler okunabilirlik açısından statik olmamalıdır, çünkü bunları statik yapmaktan ve örneği el ile geçirmekten kazanç elde etmek için hiçbir performans yoktur.

noktayı göstermek için, bu daha ziyade bu

private void AddCount(int number) { 
    current += number; 
} 

yapmalıdır: bunu yaparsanız

// Do not do this! 
private static void AddCount(MyClass obj, int number) { 
    obj.current += value; 
} 
1

Sınıftaki statik olmayan üye erişemez. Herhangi bir örnek değişkenini özel bir statik işleve parametreler olarak aktarabilirsiniz, ancak özellikle bir işlev çok fazla örnek verisi ile etkileşimde bulunduğunda, bu durum çok şişmiş ve okunması zor bir kodla sonuçlanabilir. Bir sınıfın örnek üyeleri üzerinde çalışıyorsanız ve sınıfınızın bir örneği olmadan gerçekleştirilebilecek bir işlem değilse, bunu statik yapmamalısınız.

Temel bir genel kural olarak, sınıfın tüm örnekleri için kritik olmadıkça değişkenler veya işlevler statik yapmıyorum. Bunun için elbette istisnalar vardır, ancak tüm özel yöntemlerinizi hiçbir sebepten ötürü statik yaparsanız, muhtemelen OOP paradigmasına karşı çalışacaksınız.

  1. Eğer

IMO alt sınıfları statik yöntemini geçersiz olamaz

  • (yukarıda bahsedilen) kendi sınıfındaki diğer statik olmayan üye erişemez, statik:

  • 0

    iki neden akla gelen Yöntemler bir istisna olarak daha fazla olmalıdır. Bağımlılık enjeksiyon kabı ile bir uygulamada bir işlevselliğe "kolay erişim" istiyorsanız, tek bir fasulye kullanarak ve enjekte ederek daha iyi olursunuz, çünkü ihtiyacınız olursa, uygulamayı kolayca değiştirme seçeneğine sahip olacaksınız.

    .NET'in statik yöntemler için belirli bir kullanım durumu vardır - uzantı yöntemleri. Bu nedenle, işlevselliğinizin bir uzantı yöntemi olarak kullanılabilir olmasını istiyorsanız, statik kullanmanız gerekir.

    İlgili konular