Apa gunanya variabel statis di C #? Kapan menggunakannya? Mengapa saya tidak dapat mendeklarasikan variabel statis di dalam metode?

106

Saya telah mencari tentang variabel statis di C #, tetapi saya masih belum mengerti apa kegunaannya. Juga, jika saya mencoba mendeklarasikan variabel di dalam metode itu tidak akan memberi saya izin untuk melakukan ini. Mengapa?

Saya telah melihat beberapa contoh tentang variabel statis. Saya telah melihat bahwa kita tidak perlu membuat instance kelas untuk mengakses variabel, tetapi itu tidak cukup untuk memahami apa kegunaannya dan kapan menggunakannya.

Hal kedua

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();

        Console.WriteLine(book.myInt); // Shows error. Why does it show me error?
                                       // Can't I access the static variable 
                                       // by making the instance of a class?

        Console.ReadKey();
    }
}
Kartik Patel
sumber
4
Mungkin maksud Anda "bidang statis"?
Dennis
Seperti yang kami nyatakan di kelas static int i = 5
Kartik Patel
3
VB.NET mendukung variabel statis lokal. Mereka harus menerapkannya agar tetap kompatibel dengan vb. Jumlah kode yang dihasilkannya sangat banyak , statika lokal sulit dilakukan karena tidak aman untuk thread. Bidang juga tidak aman untuk thread, tetapi semua orang mengharapkannya.
Hans Passant
jangan lupa untuk menandai jawaban sebagai diterima jika Anda mendapat info yang Anda inginkan ...
Pranay Rana
3
Anda dapat mengakses variabel / metode statis melalui type (dalam hal ini Book) no melalui sebuah instance ( book), jadi solusi yang lebih mudah adalah Book.myInt.
Jaider

Jawaban:

171

Sebuah staticvariabel berbagi nilai itu antara semua contoh kelas.

Contoh tanpa mendeklarasikannya statis:

public class Variable
{
    public int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

Penjelasan: Jika Anda melihat contoh di atas, saya baru saja mendeklarasikan intvariabelnya. Ketika saya menjalankan kode ini, hasilnya akan menjadi 10dan 10. Itu mudah.

Sekarang mari kita lihat variabel statis di sini; Saya mendeklarasikan variabel sebagai static.

Contoh dengan variabel statis:

public class Variable
{
    public static int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

Sekarang ketika saya menjalankan kode di atas, hasilnya akan menjadi 10dan 15. Jadi nilai variabel statis dibagikan di antara semua instance kelas itu.

Kartik Patel
sumber
9
@Pranay: Ya itu lebih baik tetapi jika Anda menunjukkan kepada saya contoh yang saya tunjukkan di atas daripada itu akan lebih baik untuk saya dan orang lain .... bagaimanapun juga usaha yang baik ....
Kartik Patel
1
Ini statis untuk kelas, yaitu nilainya tetap setia pada kelas dengan nilai yang disimpan di ... tunggu ... class
chwi
Anda mengatakan variabel statis dibagikan di antara semua instance kelas ... tetapi bagaimana jika tidak ada instance? Apakah Anda masih bisa menyetel variabel? Apakah diperbolehkan untuk menyimpan data dinamis dalam kelas statis?
Kokodoko
@Kokodoko, meskipun tidak ada instance, Anda pasti dapat menyetel variabelnya. Itu menjelaskan sifat statisnya
Ladmerc
33

C # tidak memiliki variabel statis sama sekali. Anda dapat mendeklarasikan bidang statis dalam definisi tipe tertentu melalui C #. Bidang statis adalah suatu keadaan, dibagi dengan semua contoh tipe tertentu. Oleh karena itu, ruang lingkup bidang statis adalah seluruh tipe. Itulah mengapa Anda tidak dapat mendeklarasikan bidang statis dalam suatu metode - metode adalah cakupannya sendiri, dan item yang dideklarasikan dalam suatu metode harus tidak dapat diakses melalui perbatasan metode.

Dennis
sumber
5
Nah, dalam dokumentasi itu dinyatakan sebagai "Bidang yang dideklarasikan dengan pengubah statis disebut variabel statis." msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx Tapi penjelasan Anda benar.
Teoman shipahi
19

variabel statis digunakan ketika hanya satu salinan variabel yang diperlukan. jadi jika Anda mendeklarasikan variabel di dalam metode, tidak ada penggunaan variabel seperti itu menjadi hanya berfungsi lokal ..

contoh statis adalah

class myclass
{
    public static int a = 0;
}

Variabel yang dinyatakan statis biasanya dibagikan di semua instance kelas.

Variabel yang dinyatakan statis biasanya dibagikan di semua instance kelas. Saat Anda membuat beberapa instance kelas VariableTest Variabel permanen ini digunakan bersama di semua instance. Jadi, pada suatu titik waktu tertentu, hanya akan ada satu nilai string yang terkandung dalam variabel permanen.

Karena hanya ada satu salinan variabel yang tersedia untuk semua instance, kode this.permament akan menghasilkan kesalahan kompilasi karena dapat diingat bahwa this.variablename merujuk ke nama variabel instance. Jadi, variabel statis harus diakses secara langsung, seperti yang ditunjukkan dalam kode.

Pranay Rana
sumber
bisa tolong jelaskan dengan contoh?
Kartik Patel
tetapi jika saya membuat instance kelas maka saya tidak dapat mengakses variabel statis. mengapa? Saya dapat mengakses variabel statis dengan classname.variable tidak hanya dengan membuat instance kelas .......... ......
Kartik Patel
@Kartik Patel karena Anda harus menggunakan nama kelas untuk mengakses myInt statis. Kenapa seperti ini, saya tidak tahu. Tetapi saya akan mengatakan bahwa itu jauh lebih jelas karena Anda ingin mengakses bagian statis dari kelas, itu tidak statis jika Anda memerlukan contoh untuk mengaksesnya.
Sementara untuk
@dowhilefor: Tapi seperti yang Anda sebutkan di atas, "Variabel yang dideklarasikan statis umumnya dibagikan di semua instance kelas." lalu apa artinya ini?
Kartik Patel
@Kartik Patel Anda tidak dapat mengakses variabel dari luar dengan sebuah instance, tetapi Anda selalu dapat menggunakan variabel statis di dalam kelas Anda dan kemudian dibagikan ke semua instance. Juga bukan saya yang memberikan jawaban ini, saya hanya mengomentarinya.
sementara untuk
9

Beberapa contoh "dunia nyata" untuk variabel statis:

membangun kelas tempat Anda dapat mencapai nilai hardcode untuk aplikasi Anda. Mirip dengan enumerasi, tetapi dengan lebih banyak fleksibilitas pada tipe data.

public static class Enemies
{
    public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}");
}

Singleton yang dikenal luas, ini memungkinkan kontrol untuk memiliki tepat satu instance kelas. Ini sangat berguna jika Anda ingin mengaksesnya di seluruh aplikasi Anda, tetapi tidak meneruskannya ke setiap kelas hanya untuk mengizinkan kelas ini menggunakannya.

public sealed class TextureManager
    {
        private TextureManager() {}
        public string LoadTexture(string aPath);

        private static TextureManager sInstance = new TextureManager();

        public static TextureManager Instance
        {
            get { return sInstance; }
        }
    }

dan ini adalah bagaimana Anda akan memanggil manajer tekstur

TextureManager.Instance.LoadTexture("myImage.png");

Tentang pertanyaan terakhir Anda: Anda mengacu pada kesalahan kompiler CS0176 . Saya mencoba menemukan informasi lebih lanjut tentang itu, tetapi hanya dapat menemukan apa yang dikatakan msdn tentang itu:

Metode statis, bidang, properti, atau peristiwa dapat dipanggil di kelas meskipun tidak ada instance kelas yang dibuat. Jika ada contoh kelas yang dibuat, mereka tidak dapat digunakan untuk mengakses anggota statis. Hanya ada satu salinan bidang dan peristiwa statis, dan metode serta properti statis hanya dapat mengakses bidang statis dan peristiwa statis.

dowhilefor
sumber
5

Variabel statis digunakan ketika hanya satu salinan yang diperlukan. Izinkan saya menjelaskan ini dengan sebuah contoh:

class circle
{
    public float _PI =3.14F;
    public int Radius;

    public funtionArea(int radius)
    {
        return this.radius * this._PI      
    }
}
class program
{
    public static void main()
    {
        Circle c1 = new Cirle();
        float area1 = c1.functionRaduis(5);
        Circle c2 = new Cirle();
        float area2 = c1.functionRaduis(6);
    }
}

Sekarang di sini kita telah membuat 2 contoh untuk classlingkaran kita , yaitu 2 set salinan _PI bersama dengan variabel lain dibuat. Jadi katakanlah jika kita memiliki banyak instance dari kelas ini, beberapa salinan _PIakan dibuat menggunakan memori. Jadi dalam kasus seperti itu, lebih baik membuat variabel seperti itu menyukai _PI staticdan mengoperasikannya.

class circle
{
    static float _PI =3.14F;
    public int Radius;

    public funtionArea(int radius)
    {
        return this.radius * Circle._PI      
    }
}
class program
{
    public static void main()
    {
        Circle c1 = new Cirle();
        float area1 = c1.functionRaduis(5);
        Circle c2 = new Cirle();
        float area2 = c1.functionRaduis(6);
    }
}

Sekarang tidak peduli berapa banyak contoh dibuat untuk classlingkaran, hanya ada satu salinan variabel yang _PImenyimpan memori kita.

TomHardy
sumber
4

Kelas statis tidak mengharuskan Anda untuk membuat objek dari kelas itu / membuat instance dari kelas itu, Anda dapat mengawali kata kunci C # statis di depan nama kelas, untuk membuatnya statis.

Ingat: kami tidak membuat instance kelas Console, kelas String, Kelas Array.

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();
       //Use the class name directly to call the property myInt, 
      //don't use the object to access the value of property myInt

        Console.WriteLine(Book.myInt);

        Console.ReadKey();

    }
}
Kunal Mukherjee
sumber
Pengamatan yang sangat baik karena jika Anda mencoba menggunakan objek untuk mengakses nilai properti myInt Anda akan mendapatkan error: static void Main () {Book book = new Book (); // ini memberi Anda kesalahan: book.myInt = 5;
leonidaa

2

Berawal dari contoh @Kartik Patel ini, saya telah sedikit merubah mungkin sekarang lebih jelas tentang variabel statis

 public class Variable
    {
        public static string StaticName = "Sophia ";
        public string nonStName = "Jenna ";
        public void test()
        {
            StaticName = StaticName + " Lauren"; 
            Console.WriteLine("  static ={0}",StaticName);
            nonStName = nonStName + "Bean ";
            Console.WriteLine("  NeStatic neSt={0}", nonStName);

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Variable var = new Variable();
            var.test();
            Variable var1 = new Variable();
            var1.test();
            Variable var2 = new Variable();
            var2.test();
            Console.ReadKey();

        }
    }

Output 
  static =Sophia  Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren Lauren
  NeStatic neSt=Jenna Bean
  1. Variabel Kelas VS Variabel Instans di C #

    Anggota Kelas Statis C # ATAU Variabel Kelas

    class A
    {
        // Class variable or " static member variable"  are declared with 
        //the "static " keyword
    
        public static int i=20;
        public int j=10;         //Instance variable 
        public static string s1="static class variable"; //Class variable 
        public string s2="instance variable";        // instance variable 
    }
    class Program
    {
        static void Main(string[] args)
        {
            A obj1 = new A();
    
            // obj1 instance variables 
            Console.WriteLine("obj1 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj1.j);
            Console.WriteLine(obj1.s2);
            Console.WriteLine(A.s1);
    
            A obj2 = new A();
    
            // obj2 instance variables 
            Console.WriteLine("obj2 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj2.j);
            Console.WriteLine(obj2.s2);
            Console.WriteLine(A.s1);
    
            Console.ReadKey();
    
        }
    
    
    }

    }

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

https://en.wikipedia.org/wiki/Class_variable

https://en.wikipedia.org/wiki/Instance_variable

https://en.wikipedia.org/wiki/Static_variable

https://javaconceptoftheday.com/class-variables-and-instance-variables-in-java/?fbclid=IwAR1_dtpHzg3bC5WlGQGdgewaTvuOI6cwVeFUtTV8IZuGTj1qH5PmKGwX0yM

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

leonidaa
tepatnya, lihat contoh @Kunal Mukjee dari atas
leonidaa
1

Anggota data dan anggota fungsi yang beroperasi pada instance tipe disebut anggota instance. Metode ToString int (misalnya) adalah contoh anggota instance. Secara default, anggota adalah anggota instance. Anggota data dan anggota fungsi yang tidak beroperasi pada contoh tipe, melainkan pada tipe itu sendiri, harus ditandai sebagai statis. Metode Test.Main dan Console.WriteLine adalah metode statis. Kelas Console sebenarnya adalah kelas statis, yang berarti semua anggotanya statis. Anda tidak pernah benar-benar membuat instance Konsol — satu konsol dibagikan di seluruh aplikasi.

MichaelY
sumber
1

Menanggapi pertanyaan "kapan menggunakannya?" pertanyaan:

Saya sering menggunakan variabel statis (kelas) untuk menetapkan ID instance unik ke setiap instance kelas. Saya menggunakan kode yang sama di setiap kelas, sangat sederhana:

//Instance ID ----------------------------------------
    // Class variable holding the last assigned IID
    private static int xID = 0;
    // Lock to make threadsafe (can omit if single-threaded)
    private static object xIDLock = new object();
    // Private class method to return the next unique IID 
    //  - accessible only to instances of the class
    private static int NextIID()                    
    {
        lock (xIDLock) { return ++xID; }
    }
    // Public class method to report the last IID used 
    // (i.e. the number of instances created)
    public static int LastIID() { return xID; }
    // Instance readonly property containing the unique instance ID
    public readonly int IID = NextIID();
//-----------------------------------------------------

Ini menggambarkan beberapa poin tentang variabel dan metode statis:

  1. Variabel dan metode statis dikaitkan dengan kelas, bukan contoh spesifik kelas.
  2. Metode statis dapat dipanggil dalam konstruktor sebuah instance - dalam hal ini, metode statis NextIID digunakan untuk menginisialisasi properti IID readonly, yang merupakan ID unik untuk instance ini.

Saya menemukan ini berguna karena saya mengembangkan aplikasi di mana kawanan objek digunakan dan itu bagus untuk dapat melacak berapa banyak yang telah dibuat, dan untuk melacak / query contoh individu.

Saya juga menggunakan variabel kelas untuk melacak hal-hal seperti total dan rata-rata properti dari instance yang dapat dilaporkan secara real time. Saya pikir kelas adalah tempat yang baik untuk menyimpan informasi ringkasan tentang semua contoh kelas.

JohnRC
sumber
0

Coba panggil langsung dengan nama kelas Book.myInt

Arnold Parge
sumber
tepatnya, lihat contoh @Kunal Mukjee dari atas
leonidaa
0

Dibandingkan dengan variabel sesi, variabel statis akan memiliki nilai yang sama untuk semua pengguna mengingat saya menggunakan aplikasi yang ditempatkan di server. Jika dua pengguna mengakses halaman yang sama dari suatu aplikasi maka variabel statis akan menyimpan nilai terbaru dan nilai yang sama akan diberikan kepada kedua pengguna tidak seperti variabel sesi yang berbeda untuk setiap pengguna. Jadi, jika Anda menginginkan sesuatu yang umum dan sama untuk semua pengguna termasuk nilai yang seharusnya digunakan bersama kode aplikasi, maka hanya gunakan statis.

pratham gn
sumber
0

Anda tidak perlu membuat instance objek, karena Anda akan menggunakan variabel statis: Console.WriteLine (Book.myInt);

Mehran Sarrafi
sumber
-1

Variabel statis mempertahankan nilai sebelumnya sampai program keluar. Statis digunakan dengan memanggil langsung class_Name.Method () atau class_Name.Property. Tidak diperlukan referensi objek. Penggunaan statik yang paling populer adalah kelas Matematika C #. Math.Sin (), Math.Cos (), Math.Sqrt ().

Md Shahriar
sumber