Apa itu "metode statis" dalam C #?

177

Apa artinya ketika Anda menambahkan kata kunci statis ke suatu metode?

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

Bisakah Anda menambahkan statickata kunci ke kelas? Apa artinya itu?

Moshe
sumber
9
Anda dapat menggunakan metode statis tanpa membuat turunan dari kelas itu hanya dengan class_name.static_method_name ();
Javed Akram
Pada level pemrograman, kami merasa bahwa kami dapat memanggil metode statis tanpa membuat instance dari kelas / tipe. Secara internal bukan itu masalahnya. CLR secara internal mengelola instance khusus bernama type instance untuk mengatur panggilan ke metode statis. Silakan lihat jawaban ini . Sangat menarik.
RBT

Jawaban:

313

Sebuah staticfungsi, tidak seperti biasa ( misalnya ) fungsi, tidak terkait dengan sebuah instance dari kelas.

Sebuah statickelas adalah kelas yang hanya dapat berisi staticanggota, dan karena itu tidak dapat dipakai.

Sebagai contoh:

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

Untuk dapat menelepon InstanceMethod, Anda memerlukan instance kelas:

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

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
Slaks
sumber
28
Jadi itu seperti metode kelas, bukan metode contoh?
Moshe
4
@ Moshe: Tepat. Dengan metode statis, Anda tidak perlu instance kelas untuk memanggil metode, hanya kelas.
Binary Worrier
3
Tetapi apakah sebenarnya ada semacam batasan teknis yang mencegah memanggil metode statis pada contoh? Jika kompiler mengizinkannya, apa bahayanya dapat diakses?
kroonwijk
2
@kroon: Tidak masuk akal. Metode instance sebenarnya hanya mengambil instance sebagai parameter pertama yang tersembunyi. Metode statis tidak. Lihat posting blog saya: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Di mana "StaticMethod" adalah metode Kelas dan "InstanceMethod" adalah Metode Instance dari Kelas SomeClass
Usman Younas
26

Dari sudut pandang lain: Pertimbangkan bahwa Anda ingin membuat beberapa perubahan pada satu String. misalnya Anda ingin membuat huruf besar dan sebagainya. Anda membuat kelas lain bernama "Alat" untuk tindakan ini. tidak ada arti membuat turunan dari kelas "Alat" karena tidak ada jenis entitas apa pun yang tersedia di dalam kelas itu (dibandingkan dengan kelas "Orang" atau "Guru"). Jadi kami menggunakan kata kunci statis untuk menggunakan kelas "Alat" tanpa membuat instance dari itu, dan ketika Anda menekan titik setelah nama kelas ("Alat") Anda dapat memiliki akses ke metode yang Anda inginkan.

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();

    }
}
}
Behnoud Sherafati
sumber
1
Menggunakan "membuat perubahan pada string" adalah contoh yang buruk - string tidak dapat diubah dan tidak dapat diubah. Tetapi, jika tidak, penjelasannya masuk akal (menggantikan kelas untuk string yang tidak dapat diubah)
Flydog57
13

Metode statis, bidang, properti, atau peristiwa dapat dipanggil pada kelas bahkan ketika tidak ada instance kelas telah dibuat. Jika instance kelas dibuat, mereka tidak dapat digunakan untuk mengakses anggota statis. Hanya satu salinan bidang dan peristiwa statis yang ada, dan metode dan properti statis hanya dapat mengakses bidang statis dan peristiwa statis. Anggota statis sering digunakan untuk mewakili data atau perhitungan yang tidak berubah sebagai respons terhadap keadaan objek; misalnya, perpustakaan matematika mungkin berisi metode statis untuk menghitung sinus dan cosinus. Anggota kelas statis dinyatakan menggunakan kata kunci statis sebelum jenis kembalinya

Alborz
sumber
5

Fungsi statis berarti bahwa ia dikaitkan dengan kelas (bukan instance kelas tertentu tetapi kelas itu sendiri) dan itu dapat dipanggil bahkan ketika tidak ada instance kelas ada.

Kelas statis berarti kelas itu hanya berisi anggota statis.

mih
sumber
5

Segera Anda tidak dapat membuat instance kelas statis: Mis:

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

Anda tidak bisa membuat seperti ini:

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

Anda hanya dapat membuat:

myStaticClass.someFunction();
r.mirzojonov
sumber
0

Ketika Anda menambahkan kata kunci "statis" ke suatu metode, itu berarti bahwa implementasi yang mendasarinya memberikan hasil yang sama untuk setiap instance kelas. Tidak perlu dikatakan, hasilnya bervariasi dengan perubahan nilai parameter

Balaji
sumber
-1

Variabel statis tidak terhubung dengan objek kelas. Itu dapat diakses menggunakan classname. Semua objek kelas akan berbagi variabel statis.

Dengan menjadikan fungsi sebagai statis, Ini akan membatasi akses fungsi itu di dalam file itu.

kapilddit
sumber
-1

Inti dari kata kunci statis yang Anda hanya akan memiliki satu salinan pada RAM ini (metode / variabel / kelas) yang dibagikan untuk semua panggilan

Mahmoud
sumber
-8

Kata kunci statis, ketika diterapkan pada suatu kelas, memberi tahu kompiler untuk membuat turunan tunggal dari kelas itu. Maka tidak mungkin untuk 'baru' satu contoh atau lebih dari kelas. Semua metode dalam kelas statis sendiri harus dinyatakan statis.

Adalah mungkin, Dan sering diinginkan, untuk memiliki metode statis dari kelas non-statis. Misalnya metode pabrik ketika membuat turunan dari kelas lain sering dinyatakan statis karena ini berarti bahwa instance tertentu dari kelas yang mengandung metode faktor tidak diperlukan.

Untuk penjelasan yang baik tentang bagaimana, kapan dan di mana lihat MSDN

Dave Arkley
sumber
8
Tidak, kelas statis tidak pernah dipakai. Mengingat bahwa semua yang ada di dalamnya adalah statis, mengapa Anda ingin instantiate?
Jon Skeet
1
Sebuah statickelas tidak memiliki contoh sama sekali.
SLaks
4
Maaf teman-teman, saya tidak mengerti ... saya katakan satu contoh dibuat dan Anda tidak dapat yang baru. Tentunya contoh tunggal, statis, dibuat jika kode tidak dapat dipanggil?
Dave Arkley 8-10
2
Kelas statis memang memiliki instance, pada kenyataannya dua, mereka hanya bukan contoh dari Tipe. Kelas statis akan ada di heap sebagai objek Jenis [Foo] (tabel metode pencarian dll untuk JIT), dan objek System.Type khusus yang digunakan untuk inisialisasi.
mccainz
Kelas dapat dideklarasikan statis, yang menunjukkan bahwa itu hanya berisi anggota statis. Tidak mungkin membuat instance dari kelas statis menggunakan kata kunci baru. Kelas statis dimuat secara otomatis oleh .NET Framework common language runtime (CLR) ketika program atau namespace yang memuat kelas tersebut dimuat.
Satheesh