2011-09-15 3 views
1

생성자에 유효성 검사 논리를 적용하고 실패하면 반환합니다. 하지만 여전히 인스턴스가 생성됩니다. 논리가 실패하면 ctor가 인스턴스를 생성하지 않아야합니다.클래스의 생성자 유효성 검사 및 해지

class Car 
{ 
    public readonly int maxSpeed; 
    private int currSpeed = 99; 
    public Car(int max) 
    { 
     if (max > 50) 
      return; 
    } 
    public Car() 
    { 
     maxSpeed = 55; 
    } 
} 

답변

9

유효성 검사가 실패하면 예외를 생성자에 전달해야합니다.

다양한 프레임 워크 클래스를 사용하면 예를 들어 System.String 또는 System.DateTime 생성자를 살펴보십시오.

+0

흠 ... 똥 남자가 .... 나는 유사한 방식의 WHI를 사용 르 WPF 프로젝트에서 일하고 ... 상속 유료 추측을 내게 ;-) –

+1

죄송합니다, 감사드립니다. 당신은 Jon Skeet 후 내 RAM에 두 번째 사용자입니다 ;-) –

+0

@ Pankaj Upadhyay : 명성에 감사드립니다! 그것은 아마도 약간의 명예이기는하지만. – Falcon

1
public static Car GetInstance(int max) 
{ 
    if (max > 50) 
     return null ; 

    return new Car(max); 
} 
+0

난 심각하게 의심이 –

+0

- 왜 누군가로부터 -1. 이것은 공장 패턴이 아니지만 일반적으로 실패의 원인은 중요하지 않지만 많은 수의 실패가 자주 발생하는 일부 응용 프로그램에서는이를 수용 할 수 있습니다. –

+0

나는 -1을하지는 않았지만이 방법을 사용하는 것은 권장하지 않습니다. 필자는 함수에서 null을 반환하지 않는 [깨끗한 코드] (http://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882) 아이디어를 선호합니다. 많은 수의 실패가 자주 발생하여 예외를 피하기를 원한다면,이 메소드를 훨씬 더 명시 적이기 때문에 'public static bool TryGetInstance (int max, out Car 인스턴스)'로 다시 작성하는 것을 선호합니다. 이는 관례적인 C#입니다. –

1

나는 생성자에서 예외를 던지는 팔콘의 답변을 선호하지만, 당신은 예외를 던지는 피하려는 경우, 당신은이 작업을 수행 할 수 있습니다

public static bool TryGetInstance(int max, out Car instance) 
{ 
    instance = null; 
    if(max > 50) 
    { 
     return false; 
    } 

    instance = new Car(max); 
    return true; 
{ 
0

은 일반적으로 다음 중 하나 (다음을 사용할 수 있습니다 내가 아는 것들 ...)

0 - 생성자가 값을 반환 할 수 없으므로 public var를 만들고이를 사용하여 객체의 상태를 나타냅니다.

1 (이 라인은 다음과 피드백을 기반으로 편집 된) - 생성자에서 예외 (여러 가지 이유로 매우 좋지 않다)

이 인상 -

또한 클라이언트의 클래스를 만드는 공장을 사용 이 스레드를 참조하십시오

http://www.eggheadcafe.com/software/aspnet/31867966/how-to-return-null-from-c-class-constructor-after-a-validation.aspx

https://softwareengineering.stackexchange.com/questions/51062/constructor-parameter-validation-in-c-best-practices

+0

생성자가 숨겨진 방식으로 인스턴스를 반환합니까 ??. 그렇다면 null을 반환하는 것이 더 나은 옵션이 될 것입니다. –

+1

C#의 생성자가 null을 반환 할 수 있다고 생각하지 않습니다. – Scott

+0

실수를 지적 해 주신데 감사의 말을 전하며, 0 점에 대한 제 제안을 변경했습니다. –

관련 문제