Tab Menu

Từ khóa tĩnh STATIC trong C#

static keyword, static c# Keyword static in C#.
Trong cùng một lớp, các đối tượng khác nhau có những biến dữ liệu cùng tên, cùng kiểu nhưng được
cấp phát ở các vùng nhớ khác nhau và giá trị của chúng cũng có thể khác nhau. Trong khi đó, thành viên tĩnh (biến, phương thức) được coi là phần chung của các đối tượng trong cùng một lớp.


Mọi đối tượng thuộc lớp đều có thể truy cập thành viên tĩnh. Nói cách khác, các thành viên thể hiện được xem là toàn cục trong phạm vi từng đối tượng còn thành viên tĩnh được xem là toàn cục trong phạm vi một lớp. Để hiểu rõ hãy xem xét sự khác biệt của Static thông qua các ví du sau. Ta có 1 lớp Tester và 1 lớp Cat.
Ví dụ bình thường.
public class Cat
    {
        private int SoMeo = -6;
        private string TenMeo;
        public Cat(string T)
        {
            TenMeo = T;
            Console.WriteLine("WOAW!!!! {0} day!", TenMeo);
            SoMeo++;
        }
        public Cat()
        {
            Console.WriteLine("Bat dau lam thit meo !!!!");
            SoMeo = 0;
        }
        public void HowManyCats()
        {
            Console.WriteLine("Dang lam thit {0} con meo!", SoMeo);
        }
    }
class Tester
    {
        static void Main(string[] args)
        {
          
             Cat tom = new Cat("Meo Tom" ); 
             tom.HowManyCats( ); 
             Cat muop = new Cat("Meo Muop"); 
             muop.HowManyCats( ); 

             Console.ReadLine(); 
        }
    }
Kết quả xuất ra như sau:
WOAW!!!! Meo Tom day!
Dang lam thit -5 con meo!
WOAW!!!! Meo Muop day!
Dang lam thit -5 con meo!

Ví dụ 2 dùng Static đơn giản.
public class Cat
    {
        private static int SoMeo = -6;
        private string TenMeo;
        public Cat(string T)
        {
            TenMeo = T;
            Console.WriteLine("WOAW!!!! {0} day!", TenMeo);
            SoMeo++;
        }
        public Cat()
        {
            Console.WriteLine("Bat dau lam thit meo !!!!");
            SoMeo = 0;
        }
        public static void HowManyCats()
        {
            Console.WriteLine("Dang lam thit {0} con meo!", SoMeo);
        }
    }
class Tester
    {
        static void Main(string[] args)
        {
          
             Cat tom = new Cat("Meo Tom" ); 
             Cat.HowManyCats( ); 
             Cat muop = new Cat("Meo Muop"); 
             Cat.HowManyCats( ); 

             Console.ReadLine(); 
        }
    }

Kết quả xuất ra như sau:
WOAW!!!! Meo Tom day!
Dang lam thit -5 con meo!
WOAW!!!! Meo Muop day!
Dang lam thit -4 con meo!
Giải thích:
  • Dòng 3: Khai báo biến tĩnh static (dùng chung cho tất cả các object thuộc lớp CAT). Tương tự như biến toàn cục.
  • Dòng 16: Method HowManyCats() muốn dùng được biến tĩnh SoMeo thì phải là method tĩnh (cơ bản).
  • Dòng 27, 29: Nguyên tắc gọi method tĩnh của lớp. Vì là phương thức tĩnh dùng chung của Class nên không được gọi đối tượng mà được gọi qua Class.

Ví dụ 3 dùng Static nâng cao.
public class Cat
    {
        private static int SoMeo = -6;
        private string TenMeo;
        public Cat(string T)
        {
            TenMeo = T;
            Console.WriteLine("WOAW!!!! {0} day!", TenMeo);
            SoMeo++;
        }
        static Cat()
        {
            Console.WriteLine("Bat dau lam thit meo !!!!");
            SoMeo = 0;
        }
        public static void HowManyCats()
        {
            Console.WriteLine("Dang lam thit {0} con meo!", SoMeo);
        }
    }
class Tester
    {
        static void Main(string[] args)
        {
          
             Cat tom = new Cat("Meo Tom" ); 
             Cat.HowManyCats( ); 
             Cat muop = new Cat("Meo Muop"); 
             Cat.HowManyCats( ); 
             Console.ReadLine(); 
        }
    }
Kết quả:
Bat dau lam thit meo !!!!
WOAW!!!! Meo Tom day!
Dang lam thit 1 con meo!
WOAW!!!! Meo Muop day!
Dang lam thit 2 con meo!
Giải thích:
Tương tự như trên nhưng ta khởi tạo thêm 1 Constructor tĩnh (Dòng 11). Kết quả xuất hiện thêm giá trị trong Constructor tĩnh định nghĩa "Bat dau lam thit meo !!!" và SoMeo = 0. Điều đó có nghĩa là Constructor tĩnh vừa khởi tạo đã được gọi. Thật vậy, dù cho trong Class Tester không gọi nó nhưng nguyên tắc là Constructor tĩnh sẽ tự động được thực thi. Nên có kết quả như trên.

Hiện có 6 comments

duc le thao
This comment has been removed by the author.
duc le thao

Sao em coppy ròi dán vô chạy nó báo ở chổ dòng 11 của ví dụ 3 ấy "static.Cat.Cat()': access modifiers are not allowed on static constructors"
bỏ static ở đậy thì mới đc mà kết quả thì ko giống như trên
giải thích dùm e với

Salipro Phạm

Sorry và rất cám ơn @duc le thao đã góp ý. Bạn chỉ cần bỏ Public ở dòng 11 là OK vì một Static Constructor không cần Access modifiers như public, private... Và s đã test lại kết quả hoàn toàn chính xác.

Anonymous

Có thể sữ dụng vd khác ngoài "làm thịt mèo" không?
Nghe nổi cả ngai óc... Tởm!

diamond dark

Thanks bài viết hay
Biến này có tính server - lần đầu chạy giảm xuống -9 con mèo, lần 2 chạy giảm xuống -8 con

dù dùng trình duyệt khác, PC khác thì lại giảm -7 con

Hỏi admin có biến nào lưu mang tính client ko , ko tính cookies và session nhé
ví dụ người 1 mở ở FFox thì -9, lần 2 ở tab khác thì -8
nhưng nếu mở lại ở chrome thì lại là -9

diamond dark

À có gì pm mình qua mail : vudh@fpt.com.vn hay qua skype vudh1982 nhé

thanks

Post a Comment

Bạn có thể tự do cho ý kiến, thảo luận về bài viết này nhưng phải theo những điều khoản sau:
- Phải nghiêm túc, không dung tục, không spam.
- Nội dung phải liên quan đến bài viết.
- Không mang tính chất chính trị...
- Hạn chế sử dụng Ẩn danh, hãy dùng Tên/URL để thay thế.
Lưu ý : Có thể sử dụng tag HTML cơ bản trong comment: br, b, i, u, a href= ...

:)
:(
;)
:D
=))
:-/
:x
I-)
@-)
=D:
:-q
:-w
[-X
B-)
:((
:-B
:-h
:x(
:-*
~O)
@};-

About

RSS
Coming soon... :))