2012-03-14 2 views
2

을 설정할 수 없습니다 데이터를 표현하는 방법 : Update의 각 인스턴스는 반드시 각 속성이 설정되지 않습니다내가 같은 속성의 수, 뭔가 포함하는 클래스가

public class Update 
{ 
    public int Quantity { get; set; } 
    public decimal Price { get; set; } 
    public string Name { get; set; } 
} 

을 시스템의 다른 부분을 어떤 것이 설정되었는지, 어떤 것이 설정되어 있지 않은지를 알아야합니다.

하나의 옵션은 모든 값 유형을 Nullable으로 만드는 것입니다. 따라서 null 값은 설정되지 않는 개념을 나타냅니다. 이 작업을하는 동안, 나는 어떤 속성을 명시 적으로 가지고있는 아이디어가 맘에 들지 않는다. Nullable (값 유형)과 참조 유형이라는 이유로 미해결 인 일부가있다. 클래스 정의는보기가 좋지 않을 것이고 널 검사가 의미 론적으로 최선의 방법이라고 확신하지는 않습니다.

IsSet 속성이있는 T에 제약이없는 Nullable<T>과 매우 유사한 클래스를 만들 수 있습니다. 나는이 옵션을 Nullable을 사용하는 것을 선호하지만, 누군가가 내가 제안한 옵션보다 나은 대체 표현을 가지고 있는지 여전히보고 싶습니다.

+1

왜 바퀴를 다시 발명합니까? 'Nullable '이 최선의 방법입니다. –

답변

5

정말로 기존의 관용구에 충실해야합니다. 기본 제공 Null 허용을 사용하십시오.

valueability 및 ref 유형에 대한 Null 허용 여부에 대한 우려가 있습니다. 해결 방법이 효과가 있습니다. 그러나 그것은 당신을 얻는 외관상의 변화 일뿐입니다. 이 경우 코드를 변경하는 대신 자신을 변경하는 것이 좋습니다. 기존 컨벤션에 자신을 적응 시키십시오.

편집 : 가끔은 제네릭 코드에서 값을 선택적으로 만들 수 있어야합니다. 이 경우 사용자 정의 옵션 유형을 사용해야합니다. 경험을 통해 나는 이것이 사용하기에 꽤 괴롭다 고 말할 수있다. 그것은 제 선택의 해결책이 아닙니다.

+0

+1 바퀴를 다시 발명하지 마십시오 –

+0

@ 감사합니다, 감사합니다. 나는 대안을 탐구하지 않고 기존의 관례에 맞추는 팬이 아니었다 :) – RichK

4

참조 유형 효과적으로, 이미 널 (NULL) 있습니다 - 당신이 다음 특성 모두가 널 (NULL)이 될 수 int?, decimal?string를 사용하는 경우.

string 값을 null 참조로 설정하려는 경우 문제가 발생합니다. null이 실제로 유효 값인 인 경우에 문제가 발생합니다.

당신은 확실히 Maybe<T> 유형을 작성할 수 있습니다,하지만 난 것 잘 모르겠어요 - 나는 아마 그냥 아무것도 제외하고 ... 널 사용하는 것이이 코드를 읽는 다른 사람을 위해 더 잘 알고있을거야 누가 C# 관용구에 익숙하다. 모든 "반대로 null"정서 (나는 많은 경우에 do을 공유 함)에 대해 가장 간단한 접근 방법 인 경우가 있습니다.

+0

그렇습니다. 그렇기 때문에 'not set'을 나타 내기 위해 null 개념을 '과부하'하고 싶지 않습니다. – RichK

+0

@RichK : 따라서 * 유효한 값으로 설정하려면 null이 필요합니까? 그렇지 않다면, * 설정되지 못하게되고, 당신은 잘 가게됩니다. –

+0

아마 ... 매우 불합리한 것 같습니다 – RichK

1

나는 일부 속성 Null 허용합니다 ( 값 유형) 및 일부하지 (참조 타입)

참조 유형을 가지고있는 생각처럼 정말 할 분명히 널 (NULL)입니다.

string t = null; //is totally valid 
1

나는이 용도로 Nullable을 사용하려고합니다. 클래스를 "is it set"과 함께 외부에 대한 일반적인 값을 표시하도록 속성을 가진 멤버를 래핑 할 수 있습니다 (필요한 경우 확인). 하지만 내부에서는 Nullable을 사용합니다.

0

당신에게 뭔가 새로운 것을 제안하는 것 ... 제한된 수의 회원으로 업데이트와 같은 한 클래스에 대해서만 이야기한다면 나는 단지 IsSet만을 사용할 것입니다.

하지만이 동작이나 많은 속성을 가진 유사한 클래스가 여러 개있는 경우 t4 템플릿을 사용하여 제안 할 수 있습니다. 예를 들어 in this article에 설명 된대로 클래스 속성 (필요한 유형 또는 속성)을 가져올 수 있으며 속성 목록을 기반으로 자동 생성되는 코드 (자동으로 원하는 디자인을 구현)

관심 ...

0

널 (null)이 null이 유효한 옵션입니다하지만 당신은 주어진 값이 이겼다 완벽하게 확신 곳

  • 는 기본값을 사용 유효한 옵션이 아닌 곳

    • 사용 널 (NULL)로 여기에 솔루션 발생합니다.
    • null이 유효한 값인 각 속성에 대해 부울 플래그를 사용하고 이제까지 사용되지 않을 기본값을 지정할 수 없습니다.

    예 :이 설정되어있는 경우 그 값이 null이 될 수 없기 때문에 수량, null 허용해야한다 이제까지

    이름은 이름이 null이 될 수있는 경우 ""에 디폴트한다

    (이름의 부족) 이름이 결코 ""되지 않을 것이라 확신합니다.

    깃발, Name이 null 값을 가질 수 있고 기본값을 생각할 수 없다면 nameSet을 사용해야한다고 가정 해 봅시다. 이 플래그는 기본적으로 false이며 Name의 값을 처음 설정할 때 플래그도 true로 설정되어야합니다.

    동일한 방법으로 모든 속성을 처리하려는 경우 솔루션은 Object 및 부울 플래그가 포함될 클래스를 만드는 것입니다. Object는 속성의 값을 저장하고 플래그는 속성이 초기화되었는지 여부를 저장하지만 필요없는 경우에도 부울 플래그를 만들기 때문에이 메서드는 마음에 들지 않습니다.