Câu trả lời:
Trong C#
bạn không thể định nghĩa các biến toàn cục thực sự (theo nghĩa là chúng không thuộc bất kỳ lớp nào).
Điều này đang được nói, cách tiếp cận đơn giản nhất mà tôi biết để bắt chước tính năng này bao gồm sử dụng static class
, như sau:
public static class Globals
{
public const Int32 BUFFER_SIZE = 512; // Unmodifiable
public static String FILE_NAME = "Output.txt"; // Modifiable
public static readonly String CODE_PREFIX = "US-"; // Unmodifiable
}
Sau đó, bạn có thể truy xuất các giá trị đã xác định ở bất kỳ đâu trong mã của mình (miễn là nó là một phần giống nhau namespace
):
String code = Globals.CODE_PREFIX + value.ToString();
Để đối phó với các không gian tên khác nhau, bạn có thể:
Globals
lớp mà không bao gồm nó vào một lớp cụ thể namespace
(để nó sẽ được đặt trong không gian tên ứng dụng toàn cầu);namespace
.Không có cái gọi là biến toàn cục trong C #. Giai đoạn = Stage.
Bạn có thể có các thành viên tĩnh nếu bạn muốn:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
ví dụ mà bạn đã cung cấp không thực sự được coi là một var toàn cầu.
Trước tiên, hãy kiểm tra xem bạn có thực sự cần một biến toàn cục thay vì sử dụng nó một cách trắng trợn mà không xem xét đến kiến trúc phần mềm của bạn hay không.
Giả sử nó vượt qua bài kiểm tra. Tùy thuộc vào cách sử dụng, Globals có thể khó gỡ lỗi với điều kiện chủng tộc và nhiều "điều tồi tệ" khác, tốt nhất hãy tiếp cận chúng từ một góc độ mà bạn đã sẵn sàng để xử lý những điều tồi tệ đó. Vì thế,
static
lớp duy nhất (để dễ quản lý).Đề cương cơ bản cho một lớp học như vậy sẽ là:
public class Globals
{
private static bool _expired;
public static bool Expired
{
get
{
// Reads are usually simple
return _expired;
}
set
{
// You can add logic here for race conditions,
// or other measurements
_expired = value;
}
}
// Perhaps extend this to have Read-Modify-Write static methods
// for data integrity during concurrency? Situational.
}
Sử dụng từ các lớp khác (trong cùng một không gian tên)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
Một tính năng hữu ích cho việc này là using static
Như những người khác đã nói, bạn phải tạo một lớp cho toàn cầu của mình:
public static class Globals {
public const float PI = 3.14;
}
Nhưng bạn có thể nhập nó như thế này để không còn viết tên lớp trước các thuộc tính tĩnh của nó:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);