2014-02-13 5 views
0

정적 클래스의 개인 정적 읽기 전용 데이터 멤버를 설정하는 방법은 무엇입니까?정적 클래스의 개인 정적 읽기 전용 데이터 멤버를 설정하는 방법?

public static class SessionInformation 
{ 
    private static readonly string UserName; 
    private static readonly string PluginID; 
    private static readonly string SessionID; 
} 

이 정적 클래스에 저장되는 동적 정보가 있지만 나중에 수정할 수 없도록하고 싶습니다.

에만 정적 생성자 사람들을 설정할 수 있습니다

답변

5

, 그래서 다음 중 하나를

public static class SessionInformation 
{ 
    private static readonly string UserName = "something"; 
    private static readonly string PluginID = "something else"; 
    private static readonly string SessionID = "some session"; 
} 

또는

public static class SessionInformation 
{ 
    static SessionInformation() 
    { 
    UserName = "something"; 
    PluginID = "something else"; 
    SessionID = "some session"; 
    } 
} 

그리고 아니, 그것은이 문제를 :) 같은 세션 정보를 저장하는 것은 좋은 생각이 아니다 정적 멤버가 실제로 매우 복잡하기 때문에 이러한 값이 실제로 할당되는시기를 거의 제어 할 수 없습니다. 더 중요한 것은, 당신은 거의 그들을 변경할 수 없습니다. 따라서 HttpContext과 같은 클래스는 정적 필드를 사용하지 않고 대신 HttpContext.Current과 같은 정적 속성을 통해 액세스되는 일반 인스턴스입니다.

좀 더 실제적인 방법은 값을 할당 할 때를보다 잘 제어하고 매개 변수로 전달할 수 있도록하는 일종의 싱글 톤 패턴을 사용하는 것입니다. 그런 다음 필드는 읽기 전용이지만 외부에서 할당됩니다 (한 번). 당신이하지 예를 들어, 전체 읽기 전용에 초점을 맞춘 경우도

는 더 나은 해결책이있을 수 :

public static class SessionInformation 
{ 
    private static bool hasBeenSet = false; 

    public static string UserName { get; private set; } 

    public static void SetValues(string userName) 
    { 
    if (hasBeenSet) return; 

    UserName = userName; 
    hasBeenSet = true; 
    } 
} 

readonly 필드없이 거의 당신이 원하는 것을 - 그들이에서 읽기 전용 효과적이다 밖에.

+2

아니요. 나는 OP가 클래스에이 값들을 제공 할것이라고 생각한다. –

+1

정보가 동적이다. – Ahsan

+1

@operation 즉, '정적 읽기 전용', 평범하고 단순한 것을 사용할 수 없음을 의미합니다. – Luaan

2

다른 대답에 언급 된 싱글 톤 패턴은 당신이 찾고있는 무엇을 믿는 것입니다 (이것은 특히 다중 스레드 환경에서,보다 강력한해야한다, 이것은 간단한 설명 샘플입니다 참고).

public class Session 
{ 
    public string UserName { get; private set; } 
    public string PluginId { get; private set; } 
    public string SessionId { get; private set; } 

    public static Session Current { get; private set; } 

    public void NewSession(string userName, string pluginId, string sessionId) 
    { 
     Current = new Session 
     { 
      UserName = userName, 
      PluginId = pluginId, 
      SessionId = sessionId 
     }; 
    } 

    private Session() 
    { 

    } 
} 

여기에 당신은 당신이 당신의 특성에 대한 읽기 액세스 권한을 얻기 위해 정적 Session.Current와 응용 프로그램을 통해 모든 액세스 할 수있는 새로운 Session을 만들 수 있습니다. 값을 변경하는 유일한 방법은 Session 클래스에서 또는 NewSession- 메서드를 사용하여 현재 세션을 바꾸는 것입니다.

관련 문제