모든 클래스 (* .cs)가 인스턴스 참조없이 해당 콘텐츠에 액세스 할 수 있도록 변수를 선언하려면 어떻게해야합니까?
답변
에서는 C#
진정한 전역 변수를 정의 할 수 없습니다 (클래스에 속하지 않는다는 의미에서).
이 기능을 모방하는 가장 간단한 방법 static class
은 다음과 같이 를 사용하는 것입니다.
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
}
그런 다음 코드에서 정의 된 값을 검색 할 수 있습니다 (동일한 부분 인 경우 namespace
).
String code = Globals.CODE_PREFIX + value.ToString();
다른 네임 스페이스를 처리하기 위해 다음 중 하나를 수행 할 수 있습니다.
Globals
특정 클래스에 포함하지 않고 클래스를 선언하여namespace
글로벌 애플리케이션 네임 스페이스에 배치합니다.- 다른에서 변수를 검색하려면 적절한 using 지시문을 삽입하십시오
namespace
.
답변
C #에는 전역 변수와 같은 것이 없습니다. 기간.
원하는 경우 정적 멤버를 가질 수 있습니다.
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
답변
먼저 소프트웨어 아키텍처를 고려하지 않고 노골적으로 사용하는 대신 전역 변수가 정말로 필요한지 조사하십시오.
테스트를 통과했다고 가정합시다. 사용법에 따라 Globals는 경쟁 조건 및 기타 많은 “나쁜”으로 디버그하기 어려울 수 있습니다. 그런 나쁜 일을 처리 할 준비가 된 각도에서 접근하는 것이 가장 좋습니다. 그래서,
- 이러한 모든 전역 변수를 단일
static
클래스 로 래핑합니다 (관리 용이성). - 필드 (= ‘변수’) 대신 속성이 있습니다. 이렇게하면 향후 Globals에 대한 동시 쓰기 문제를 해결할 수있는 몇 가지 메커니즘이 있습니다.
이러한 클래스의 기본 개요는 다음과 같습니다.
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.
}
다른 클래스의 사용 (동일한 네임 스페이스 내)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
답변
이에 대한 유용한 기능은 using static
다른 사람들이 말했듯이 글로벌 클래스를 만들어야합니다.
public static class Globals {
public const float PI = 3.14;
}
그러나 더 이상 정적 속성 앞에 클래스 이름을 쓰지 않기 위해 다음과 같이 가져올 수 있습니다.
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);