2011-03-24 4 views
1

C# 클래스의 생성자에서 메서드를 호출하는 것은 좋지 않지만 나는 이상한 것을 고수하고 있습니다. 내 문제는 클래스의 개체를 만들 때 개체의 필드에 임의의 숫자를 할당해야한다는 것입니다. 내 경우 C#에서 클래스의 생성자에서 임의의 숫자를 생성하는 방법

class RandomNumberHandler 
    { 
     private int randomNumber; 
     public RandomNumberHandler() 
     { 
      this.randomNumber = GenerateRandomNumber(); 
     } 

     private int GenerateRandomNumber() 
     { 
      return (new Random()).Next(3000) + 1000; 
     } 
    } 

예를

에 대한

나는 네 자리 번호가 필요합니다. 클래스에서 임의의 숫자를 생성하여 객체를 생성하고 생성자에 매개 변수로 전달하지만 다른 클래스에서 임의의 숫자를 생성하는 것은 강한 응집력을 얻기 위해 매우 좋은 아이디어로 보이지 않습니다. 내 수업. 내 대학에서 "고품질 코드"과정을 위해이 작업을 수행하고 있으며 최선의 접근 방식을 찾고 있습니다. 모든 아이디어를 어떻게 환영합니까?

+1

생성자에서 ** 생성되는 개체 ** ** 가상 ** (추상 포함) 메서드 **를 호출하는 것은 좋지 않습니다. 메서드를 호출하는 것은 괜찮습니다. 실제로는 정상입니다. –

답변

5

첫 번째 off : 생성자에 가상이 아닌 메서드를 호출해도 아무런 문제가 없습니다. 거기 읽었다는 것을 어디에서 읽었습니까? (참고 : 가상을 호출하는 것은 문제가 될 수 있으며 자동 no-no는 아니지만주의 깊게 수행하는 작업을 관찰해야합니다.

GenerateRandomNumber이 호출 될 때마다 새 Random 인스턴스를 생성하는 것은 낭비입니다. 다음은 이해가되지 않습니다, GenerateRandomNumber 만 (생성자) 각 인스턴스의 일생에 한 번 호출되는 경우 :하지만이 또 다른 문제를 제기

class RandomNumberHandler 
{ 
    private readonly Random random = new Random(); 
    private int randomNumber; 

    public RandomNumberHandler() 
    { 
     this.randomNumber = GenerateRandomNumber(); 
    } 

    private int GenerateRandomNumber() 
    { 
     return this.random.Next(3000) + 1000; 
    } 
} 

을 : 당신은 것을 해결하기 위해 필드에 Random 인스턴스를 추출 할 수 있습니다 각 개체에 대해 새로 Random을 만듭니다. 따라서 다음 단계는 randomstatic으로 만드는 것입니다. 이 GenerateRandomNumberstatic 될 수 있다는 것을 의미한다 (실제로, 그것은에있다) :

class RandomNumberHandler 
{ 
    private static readonly Random Random = new Random(); 
    private int randomNumber; 

    public RandomNumberHandler() 
    { 
     this.randomNumber = GenerateRandomNumber(); 
    } 

    private static int GenerateRandomNumber() 
    { 
     return Random.Next(3000) + 1000; 
    } 
} 
+3

고품질 코드 강좌에서 추측하고 있습니까? – Mikeb

+0

누가 알고 있니?이 선생님들은 항상 일을 어떻게해야하는지에 대한 자신의 견해를 강요해야합니다. 나는 항상 학년을위한 흐름을 따라 간다. – Pete

+0

생성자에서 * virtual * 메서드를 호출 할 때 몇 가지 고려 사항이 있습니다. –

0

RandomHandler라는 또 다른 클래스의 내부에서 Random 클래스를 래핑하면 아무런 응집력이 보이지 않습니다. 개인적으로, 나는 그것이 어색하다고 생각한다. 완전히 새로운 난수가 필요하면 Random()을 호출하십시오. 다음 (3000) 또는 당신이 말한 것과 같은 생성자 내부가 무엇이든 말하십시오.

4

이 코드는 정상적으로 작동합니다. 단, 연속해서 빠르게 호출하면 "동일한"난수가 발생할 가능성이 높습니다.

class RandomNumberHandler 
{ 
    private static Random random = new Random(); 
    private static object syncObj = new object(); 

    private int randomNumber; 
    public RandomNumberHandler() 
    { 
     this.randomNumber = GenerateRandomNumber(); 
    } 

    private static int GenerateRandomNumber() 
    { 
     lock(syncObj) 
      return random.Next(3000) + 1000; 
    } 
} 
+0

+1 두 개의 다른 답변과 비슷하지만 스레드로부터 안전한 유일한 답변입니다. –

+0

@ 존 : 내가 게시했을 때, 그것은 statics를 사용하고있는 유일한 버전이었다;) –

0

당신이 리프트 경우

당신은 물론, 쉽게 같은 (여러 개의 스레드를 사용하는 경우 스레드 안전을 위해 잠금) 정적 임의의 숫자를 사용하여 해당 해결할 수

class RandomNumberHandler { 
    private static Random random = new Random(); 
    private int randomNumber = GenerateRandomNumber(); 

    private static int GenerateRandomNumber() { 
    return random.Next(3000) + 1000; 
    } 
} 

또는 더 간단하게 (덜 읽을 수) :

,369 정적 필드로 Random 인스턴스와는 GenerateRandomNumber 정적, 당신은 randomNumber 필드의 선언에 전화를 할 수 있도록
class RandomNumberHandler { 
    private static Random random = new Random(); 
    private int randomNumber = random.Next(3000) + 1000; 
} 

생성자에서 메소드를 호출하는 것처럼 보이지는 않지만 생성 된 CIL을 보면 알 수 있습니다.

또한 스레드 안전성을 염두에 둔다면 article을 살펴보십시오.

관련 문제