2017-02-19 4 views
3

의 다른 값은 내가 싱글 톤 패턴을 사용하여 간단한 클래스가 있습니다싱글 톤 패턴 속성

public class MyClass 
{ 
    private MyClass() 
    { } 

    private static MyClass instance; 
    private static readonly object locked = new object(); 

    //Singleton 
    public static MyClass Instance 
    { 
     get 
     { 
      lock (locked) 
      { 
       if (instance == null) 
       { 
        instance = new MyClass(); 
       } 
      } 

      return instance; 
     } 
    } 

    public string Rand 
    { 
     get 
     { 
      return new Random().Next(2500).ToString(); 
     } 
    } 
} 

을하지만 내가 할 경우 :

var instance1 = MyClass.Instance; 
var instance2 = MyClass.Instance; 

instance1.Randinstance2.Rand는 다른 값을 가지고있다.

왜 내 싱글 톤에는 두 개의 서로 다른 인스턴스가 있으며이를 해결하는 방법은 무엇입니까?

답변

1
당신이 랜드에 액세스하려고 할 때마다, 그것이 대신이 시도 새로운 임의의 인스턴스

를 만드는 원인이되는 get 메소드를 호출

: 당신은 Rand 인 임의의 값 매번 계산하는

private string _rand = return new Random().Next(2500).ToString(); 

public string Rand { 
get { 
    return _rand; 
} 
} 
+0

도움 주셔서 감사합니다. –

1

을 읽으십시오.

+0

도움 주셔서 감사합니다. –

1

개인 필드를 만들거나이 값을 만들 때마다 같은 값을 만들려는 경우 매번 새로운 임의 값을 생성하는 Rand 속성에 액세스하는 단일 인스턴스와 차이가 있습니다.

private string _rand; 

    public static MyClass Instance 
    { 
     get 
     { 
      lock (locked) 
      { 
       if (instance == null) 
       { 
        instance = new MyClass(); 
        _rand = return new Random().Next(2500).ToString(); 

       } 
      } 

      return instance; 
     } 
    } 

public string Rand { 
get { 
    return _rand; 
} 
} 
+0

도움 주셔서 감사합니다. –

1

그냥 믹스에 약간의 C# 6을 추가하고 사이의 차이를 들어 .NET 4.

public class MyClass 
     { 
      private static Lazy<MyClass> instance = new Lazy<MyClass>(() => new MyClass()); 

      public static MyClass Instance => instance.Value; 

      public string Rand { get; } = (new Random()).Next(2500).ToString(); 

      private MyClass() { } 
     } 

편집 의 Lazy를 사용하는및 public string Rand { get; } = (new Random()).Next(2500).ToString(); 첫 번째 코드는 필드 초기화 중에 두 번째가 실행되는 동안 속성의 본문 (get {everything in hear})에서 코드를 실행합니다 (생성자보다 먼저 실행되는 특수 단계). 이를 자동 속성 초기화 프로그램이라고합니다. 그리고 당신은 당신이 https://blogs.msdn.microsoft.com/csharpfaq/2014/11/20/new-features-in-c-6/

참고 볼 수 있습니다 더 많은 정보를 위해이

public readonly string rand = (new Random()).Next(2500).ToString(); 

      public string Rand 
      { 
       get 
       { 
        return rand; 
       } 
      } 

를 몸부림에 동일합니다 : 싱글은 그래서 당신이 그것을 사용하지 않을 수 있습니다 경우 Antipattern 것으로 간주됩니다.

+0

왜 'string Rand {get; 다음에 (2500) .ToString();'get {return new Random(). Next (2500) .ToString();}} = (새로운 랜덤()). }'같은 값을 반환하지 않습니까? –

+0

@ Azerty123 좀 더 자세한 정보로 편집했습니다 –

+0

@ Azerty123 싱글 톤은 [안티 패턴] (https://www.microsoft.com/net/tutorials/csharp/getting-started/patterns-antipatterns)으로 간주됩니다. 그것을 사용하지 않을 수 있습니다. –