Biến toàn cục và biến cục bộ khái niệm này được sinh ra khi mà các ngôn ngữ lập trình tiến hành thu dọn bộ nhớ sau mỗi lần thực hiện hàm hoặc khối lệnh. Việc xuất hiện khái niệm này khiến đối lúc gây khó chịu đối với người học lập trình, nhưng khái niệm này chỉ thực sự khó hiểu đối với những người không nắm chắc đó là gì. Vậy trong bài viết ngày hôm nay hãy cùng mình đi tìm hiểu nó nhé !
Biến toàn cục trong C#
Biến toàn cục là biến có thể sử dụng được ở mọi hàm, mọi khối lệnh, mọi vị trí trong chương trình miễn là vị trí sử dụng của nó hợp lệ. Ví dụ sau đây sẽ thể hiện cực kì rõ ràng về biến toàn cục.
using System.IO; using System; class luyencodec_ { class Program { static int a = 10; static void Main() { Console.WriteLine(a); f(); Console.ReadKey(); // dừng màn hình } static void f() { Console.WriteLine(a + 1); } } }
Chương trình này cho ra kết quả:
10 11
Mặc dù biến a
mình đã khai báo bên ngoài 2 hàm Main và hàm f nhưng khi mình sử dụng biến a
trong 2 hàm này chương trình vẫn chạy bình thường. Vì vậy, trong chương trình này biến a
sẽ được coi là biến toàn cục của chương trình.
Lưu ý:
- Khai báo biến bên ngoài các hàm các bạn cần phải sử dụng thê từ khóa
static
ở trước. - Chúng ta vẫn có thể khai báo nhiều biến toàn cục cùng lúc bên ngoài hàm main, miễn là việc khai báo hợp lệ.
Ví dụ sau minh họa cho việc sử dụng biến toàn cục nhưng vị trí sử dụng không hợp lệ:
using System.IO; using System; namespace luyencodec_ { class Program { static int a = 7810; static void Main() { Console.WriteLine(a); Console.ReadKey(); // dừng màn hình } Console.WriteLine(a); // sử dụng biến toàn cục sai vị trí trong chương trình } }
Chương trình này sẽ báo lỗi ở dòng 15 vì sử dụng câu lệnh với biến toàn cục không hợp lệ:
main.cs(15,26): error CS1519: Unexpected symbol `(' in class, struct, or interface member declaration main.cs(15,28): error CS1519: Unexpected symbol `)' in class, struct, or interface member declaration
Biến cục bộ trong C#
Biến cục bộ là khái niệm chỉ cho một biến số, hay cấu trúc, được khai báo trong một hàm hoặc một khối lệnh và sẽ bị giải phóng bộ nhớ ngay sau khi chương trình thực thi xong hàm hoặc khối lệnh đó. Vì vậy, sau khi thoát ra khỏi hàm hay khối lệnh đó chúng ta không thể tiếp tục sử dụng biến cục bộ đó.
Nhắc tới biến cục bộ chúng ta có một ví dụ cực đơn giản liên quan tới vòng lặp for.
using System.IO; using System; namespace luyencodec_ { class Program { static void Main() { for (int i = 0; i < 5; ++i) { Console.WriteLine(i); } Console.ReadKey(); // dừng màn hình } } }
Chương trình này sẽ in ra các số từ 0 tới 4 như sau:
0 1 2 3 4
Trong chương trình này biến i
ở vòng lặp for sẽ được coi là biến cục bộ vì biế này được khai báo trong khối lệnh for. Giờ chúng ta thử sử dụng bên ngoài khối lệnh for xem chuyện gì xảy ra nhé !
using System.IO; using System; namespace luyencodec_ { class Program { static void Main() { for (int i = 0; i < 5; ++i) { Console.WriteLine(i); } Console.WriteLine(i); // sử dụng biến i ngoài khối lệnh for Console.ReadKey(); // dừng màn hình } } }
Chương trình này sẽ báo lỗi ở dòng 14, lỗi này nói rằng biến i
ở khối lệnh hiện tại không tồn tại, chứng tỏ rằng chương trình đã giải phóng bộ nhớ của biến `i` ngay sau khi kết thúc vòng lặp for.
main.cs(14,31): error CS0103: The name `i' does not exist in the current context
Chúng ta cùng đến một ví dụ khác với biến cục bộ trong một hàm:
using System.IO; using System; namespace luyencodec_ { class Program { static void Main() { In100(); Console.ReadKey(); // dừng màn hình } static void In100() { int i = 100; Console.WriteLine(i); } } }
Không khó hiểu khi chương trình này cho ra kết quả là 100
. Biến i
được khai báo trong hàm In100
sẽ được coi là biến toàn cục vì nó được khai báo trong hàm In100
và sẽ bị giải phóng bộ nhớ ngay sau khi hàm này thực thi xong. Chúng ta thử sử dụng biến i
trong hàm Main, một hàm khác của chương trình.
using System.IO; using System; namespace luyencodec_ { class Program { static void Main() { In100(); Console.WriteLine(i); // cố gắng sử dụng biến i Console.ReadKey(); // dừng màn hình } static void In100() { int i = 100; Console.WriteLine(i); } } }
Chương trình này sẽ báo lỗi ở dòng 12. Vì biến i
lúc này không tồn tại.
main.cs(12,31): error CS0103: The name `i' does not exist in the current context
Tổng kết
Mặc dù khái niệm biến toàn cục và biến cục bộ có đôi chút gây khó chịu đối với người học lập trình hay là người lập trình viên lâu năm. Nhưng việc xuất hiện khái niệm này giúp chúng ta làm quen với khái niệm clean code (code sạch). Clean Code sẽ là một việc rất tốt vì code của bạn sẽ cực kì dễ đọc và dễ hiểu. Cảm ơn bạn đã đọc bài viết này. Hãy tiếp tục đồng hành cùng Lập trình không khó trong các bài viết tiếp theo nhé !
(các bạn có thể tham khảo thêm một số vấn đề của một số người dùng khác về vấn đề này tại đây).
Để lại một bình luận