2012-06-08 3 views
0

의 멤버로 만들려면 API를 사용하여 일부 작업을 수행했습니다. 이것은 처음 사용했을 때의 예입니다.클라이언트를 새로운 클래스

var someStuff = new myObject(); 
someStuff.Name = "stackOverflow"; 
someStuff.Options.MaxSurname = 5; //this caused me to get a runtime exception, Options is Null 

수정이 간단했습니다. 인스턴스를 만들려면 Options 멤버를 새로 만들어야했습니다.

someStuff.Options = new Options(); 
someStuff.Options.MaxSurname = 5; 

이제 예상대로 작동합니다. 괜찮아? 클라이언트로서 나는이 옵션 멤버를 새로 만들어야한다는 것을 알지 못했습니다. 빠른 수정 일단 디버그에 가서 런타임 null 개체 예외가있어.

답변

0

예. 괜찮습니다. 어떤 이유로 인해 사용중인 API에서 Options 객체를 작성해야하며 컴파일러에서이를 확인할 수 없습니다 (따라서 런타임에 예외가 발생 함). 이 당신에게 더 자연스러운 느낌이 경우

또한, SomeStuff에 적용하기 전에 개체를 contruct 수 :

Options someOptions = new Options(); 
someOptions.MaxSurname = 5; 
someStuff.Options = someOptions; 
+0

네가 말했듯이 네가 그렇게하는 것이 더 자연 스럽다. 나는 컴파일러가이 상황에서 더 현명하지 않다는 것을 안다. 그런 클래스를 디자인 할 수있는 대안적인 방법이 있다면 나는 생각하고 있었다. 즉 최초 사용시의 구성물 또는 이와 유사한 것. –

+0

@ Science_Fiction : 물론 myObject 클래스는 초기화시 Options 객체를 생성 할 수 있습니다. 또는 생성자에서 options 매개 변수가 필요할 수 있습니다. 모든 것은 실제로 API의 사용을 얼마나 제한 하느냐에 달려 있습니다. (예를 들어, Options 객체가 필요합니다 ...) –

+0

옵션 설정은 선택 사항입니다. 그래서 아무도 그것을 사용하지 않으므로 그것은 무의미한 것으로 간주 될 수 있기 때문에 그것이 생성자에서 초기화되지 않은 이유입니다. –

0

당신은 항상 공장 방법을 사용할 수 있습니다.

샘플 코드 :

public class MyObjectFactory 
{ 
    public static MyObject CreateSomeObject() 
    { 
     return new MyObject() { SomeOptions = new Options(); } 
    } 
} 

// used as ... 
var myObject = MyObjectFactory.CreateSomeObject(); 
myObject.Options.MaxSurNames = 5; 

는 따라서 더 이상을 MyObject의 불완전한 인스턴스를 얻을 수 있습니다. 그리고 자연스러운 느낌.

관련 문제