2013-08-04 3 views
4

내가 내 질문에 명확하게 의사 코드의 다음 조각을 사용 (사용 된 클래스는 중요하지 않다) : 지금은이 코드를 사용하려면개체 속성에 기본값이 있는지 어떻게 알 수 있습니까?

var client = new SmtpClient(); 
client.Credentials = ...; 

. 어떻게 사용하는지 어떻게 알 수 있습니까? 나는이 같은 속성 값을 설정을 시도 할 수 있습니다 : 할당 된 기본 자격 증명 개체가 없기 때문에

client.Credentials.User = "MyUsername"; 

이 나에게있는 NullReferenceException를 제공해야한다. 아니면이처럼 사용할 수 있습니다

client.Credentials = new Credentials("MyUsername",...); 

그러나 올바른 방법을 속성을 초기화하는 것이 같은 DefaultNetworkCredentials에게 자신을 설정 :

client.Credentials = CredentialCache.DefaultNetworkCredentials; 

가 어떻게 객체의 속성이있는 경우 알 수 있습니까 문서를 보지 않고 설계시의 기본값 (존재하는 경우)?

개체 속성의 모범 사례/디자인 가이드 라인은 무엇입니까? 속성에는 항상 기본값이 있어야합니까?

+0

정말 설명서를 읽어야합니다. 그러나 기본값을 설정하지 않으면 참조 유형이 null이됩니다. –

+0

@ojr은 확실하게 말할 수 없습니다. 자동 속성의 경우 이는 사실이지만 BCL이 내부적으로 수행하는 작업을 알고있는 사람은 누구나 마찬가지입니다. – usr

답변

2

일반적으로 호출자가 일상적으로 "레벨 건너 뛰기"해야하는 API를 설계하는 것은 좋지 않습니다. 귀하의 예에서는 API 사용자가 자격 증명의 내부 구조, 구체적으로 자격 증명에 사용자 이름을 알아야합니다. 이는 밀 결합의 표시입니다. API 디자인이 피하려고 노력해야하는 사항입니다.

이 주위에 방법은 다음과 같이, 예를 들어, API의 사용자에 대한 간접 수준을 건너 뛸 방법에 노출 될 수

:

void SetCredentialsUser(string user) { 
    // Do the checks necessary to see if credentials are there; 
    // create a new instance if necessary. 
} 

는 이제 API의 사용자가 API 만 처리 할 수 ​​있습니다 Credentials 개체의 API가 아닙니다. Credentials이 설정되지 않을 수도 있다는 사실은이 방법 뒤에 숨어 있습니다. 또한 API를 통해 읽기 전용 버전의 자격 증명을 표시하고 읽기/쓰기 버전을 사용하여 사용자 이름을 작성하려는 시도를 막을 수도 있습니다.

0

최상의 방법은 문서를 확인하는 것입니다. 그러나 반사를 통해 DefaultValue 속성을 찾을 수도 있습니다.

2

속성은 작성자가 원하는대로 구현할 수있는 메서드이기 때문에 문서가 없으면 알 수 없습니다. 이 속성은 임의의 숫자를 그려서 결정할 수 있습니다.

그래서 속성 작성자의 성명을 통해이 속성이 null이 아니란 것을 보증해야합니다.

MSDN 탐색보다 Reflector를 사용하여 클래스를 조사하는 것이 더 빠릅니다. 또한 MSDN에서 이러한 사항을 문서화하지 않는 경우도 있습니다.

UI 구성 요소의 경우 속성 표가 사용자에게 기본값을 자주 표시합니다. 다른 값을 설정하면 굵게 표시됩니다. 이 정보는 DefaultValue에서 가져온 것입니다. 그러나 속성이 정확하다는 보장은 없습니다.

관련 문제