C # 'da “statik yöntem” nedir?


177

Statik anahtar kelimeyi bir yönteme eklediğinizde ne anlama gelir?

public static void doSomething(){
   //Well, do something!
}

staticAnahtar kelimeyi sınıfa ekleyebilir misiniz ? O zaman ne anlama geliyor?


9
Sadece class_name.static_method_name () ile o sınıfın bir örneğini oluşturmadan statik yöntemi kullanabilirsiniz;
Javed Akram

Programlama düzeyinde, bir sınıf / tür örneği oluşturmadan statik bir yöntem çağırabileceğimizi hissediyoruz. Dahili olarak durum böyle değil . CLR , statik yöntemlere yapılan çağrıları yönetmek için type örneği adı verilen özel bir örneği dahili olarak yönetir . Lütfen bu cevaba bakınız . Çok ilgi çekici.
RBT

Yanıtlar:


313

Bir staticişlev, normal ( örnek ) bir işlevin aksine , sınıfın bir örneğiyle ilişkili değildir.

Bir staticsınıf yalnızca içerebilen bir sınıftır staticörneklenemez bu nedenle kişi, ve.

Örneğin:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

Aramak InstanceMethodiçin sınıfın bir örneğine ihtiyacınız var:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
Yani bir örnek yöntemi yerine bir sınıf yöntemi gibi mi?
Moshe

4
@Moshe: Kesinlikle. Statik bir yöntemle, yöntemi çağırmak için yalnızca sınıfın bir örneğine ihtiyacınız yoktur.
İkili Worrier

3
Ama aslında bir örnek üzerinde statik bir yöntem çağırmayı engelleyen bir tür teknik sınırlama var mı? Derleyici izin verirse, erişilebilir olması tehlikesi nedir?
kroonwijk

2
@kroon: Hiç mantıklı değil. Örnek yöntemleri aslında bir örneği ilk gizli parametre olarak alır. Statik yöntemler yoktur. Blog gönderime bakın: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

"StaticMethod", Sınıf yöntemi ve "InstanceMethod", Sınıf SomeClass'ın Örnek Yöntemi'dir
Usman Younas

26

Başka bir bakış açısından: Tek bir Dizede bazı değişiklikler yapmak istediğinizi düşünün. örneğin Harf büyük harfini yapmak istiyorsunuz. bu işlemler için "Araçlar" adında başka bir sınıf oluşturursunuz. "Tools" sınıfının bir örneğini oluşturmanın bir anlamı yoktur, çünkü bu sınıf içinde herhangi bir varlık yoktur ("Kişi" veya "Öğretmen" sınıfıyla karşılaştırın). Bu nedenle, herhangi bir örnek oluşturmadan "Tools" sınıfını kullanmak için static anahtar sözcük kullanıyoruz ve sınıf adından sonra noktaya ("Tools") bastığınızda istediğiniz yöntemlere erişebilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
"Bir dizede değişiklik yapmak" kötü bir örnektir - dizeler değiştirilemez ve değiştirilemez. Ancak, aksi takdirde, açıklama mantıklıdır (dize için değişmez bir sınıfın yerini alır)
Flydog57

13

Sınıfın hiçbir örneği oluşturulmamış olsa bile, sınıfta statik yöntem, alan, özellik veya olay çağrılabilir. Sınıfın herhangi bir örneği oluşturulursa, statik üyeye erişmek için kullanılamazlar. Statik alanların ve olayların yalnızca bir kopyası vardır ve statik yöntemler ve özellikler yalnızca statik alanlara ve statik olaylara erişebilir. Statik üyeler genellikle nesne durumuna yanıt olarak değişmeyen verileri veya hesaplamaları temsil etmek için kullanılır; örneğin, bir matematik kütüphanesi sinüs ve kosinüsü hesaplamak için statik yöntemler içerebilir. Statik sınıf üyeleri, memenin dönüş türünden önce static anahtar sözcüğü kullanılarak bildirilir


5

Statik işlev, sınıfla ilişkilendirildiği (sınıfın belirli bir örneği değil, sınıfın kendisi) anlamına gelir ve hiçbir sınıf örneği olmasa bile çağrılabilir.

Statik sınıf, sınıfın yalnızca statik üyeler içerdiği anlamına gelir.


5

Kısaca statik sınıfı başlatamazsınız: Örn:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

Böyle yapamazsın:

myStaticClass msc = new myStaticClass();  // it will cause an error

Yalnızca şunları yapabilirsiniz:

myStaticClass.someFunction();

0

Bir yönteme "statik" anahtar kelime eklediğinizde, temeldeki uygulamanın sınıfın herhangi bir örneği için aynı sonucu verdiği anlamına gelir. Söylemeye gerek yok, sonuç parametrelerin değerindeki değişime göre değişir


-1

Statik değişken, sınıfın nesnesiyle bağlantı oluşturmaz. Bu klasöre classname kullanılarak erişilebilir. Sınıfın tüm nesnesi statik değişkeni paylaşır.

İşlevi statik olarak yaparak, bu işlevin söz konusu dosyadaki erişimini kısıtlar.


-1

Tüm aramalar için paylaşılan bu RAM anahtarında (yöntem / değişken / sınıf) yalnızca bir kopyasına sahip olacağınız statik anahtar kelimenin çekirdeği


-8

Statik anahtar kelime, bir sınıfa uygulandığında derleyiciye o sınıfın tek bir örneğini oluşturmasını söyler. Bu durumda sınıfın bir veya daha fazla örneğini 'yeni' yapmak mümkün değildir. Statik bir sınıftaki tüm yöntemlerin kendileri statik olarak bildirilmelidir.

Statik olmayan bir sınıfın statik yöntemlerine sahip olmak mümkündür ve çoğu zaman arzu edilir. Örneğin, başka bir sınıfın örneğini oluştururken fabrika yöntemi genellikle statik olarak bildirilir, çünkü bu, faktör yöntemini içeren sınıfın belirli bir örneğinin gerekli olmadığı anlamına gelir.

İyi bir açıklama için nasıl, ne zaman ve nerede olduğunu görmek MSDN'yi


8
Hayır, statik bir sınıf hiçbir zaman somutlaştırılmaz. İçindeki her şeyin statik olduğu düşünüldüğünde, onu neden başlatmak istersiniz ?
Jon Skeet

1
Bir staticsınıfın hiç örneği yoktur.
SLaks

4
Üzgünüm çocuklar, anlamıyorum ... Tek bir örnek oluşturulduğunu ve yeni bir örnek oluşturamayacağınızı söyledim. Şüphesiz tek bir statik örnek oluşturulur, aksi takdirde kod çağrılabilir olmaz mı?
Dave Arkley

2
Statik bir sınıfın bir örneği vardır, aslında iki, sadece Tipin örnekleri değildir. Yığın üzerinde bir [Foo] Türü nesnesi (JIT için yöntem arama tablosu vb.) Ve başlatma için kullanılan özel bir System.Type nesnesi olarak statik bir sınıf bulunacaktır.
mccainz

Bir sınıf yalnızca statik üyeler içerdiğini belirten statik olarak bildirilebilir. Yeni anahtar sözcüğü kullanarak statik sınıf örnekleri oluşturmak mümkün değildir. Sınıfı içeren program veya ad alanı yüklendiğinde, statik sınıflar .NET Framework ortak dil çalışma zamanı (CLR) tarafından otomatik olarak yüklenir.
Satheesh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.