[c#] C #에서 전역 변수를 사용하는 방법?

모든 클래스 (* .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는 경쟁 조건 및 기타 많은 “나쁜”으로 디버그하기 어려울 수 있습니다. 그런 나쁜 일을 처리 할 준비가 된 각도에서 접근하는 것이 가장 좋습니다. 그래서,

  1. 이러한 모든 전역 변수를 단일 static클래스 로 래핑합니다 (관리 용이성).
  2. 필드 (= ‘변수’) 대신 속성이 있습니다. 이렇게하면 향후 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);


답변