문제

다음과 같은 여러 속성을 포함하는 클래스가 있습니다.

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

각 인스턴스 Update 각 속성 집합이 반드시 필요한 것은 아니며 시스템의 다른 부분에서는 설정된 속성과 설정되지 않은 속성을 알아야 합니다.

내가 가진 한 가지 옵션은 모든 값 유형을 만드는 것입니다. Nullable 그래서 null 값은 설정되지 않는다는 개념을 나타냅니다.이것이 효과가 있기는 하지만 일부 속성을 명시적으로 갖는 아이디어는 별로 마음에 들지 않습니다. Nullable (값 유형) 및 일부는 참조 유형으로 인해 null이 가능합니다.클래스 정의가 보기 흉해 보일 수 있으며 null 검사가 의미상 최선의 접근 방식이라고 확신하지 않습니다.

나는 다음과 매우 유사한 클래스를 만들 수 있습니다. Nullable<T> 그건 아무런 제약이 없다. TIsSet 재산.나는 다음을 사용하는 것보다 이 옵션을 선호합니다. Nullable, 하지만 제가 제안한 옵션보다 더 나은 대체 표현을 가진 사람이 있는지 확인하고 싶습니다.

도움이 되었습니까?

해결책

여기서는 기존 관용구를 고수해야 합니다.내장된 null 허용 여부를 사용하세요.

값 및 참조 유형에 따라 null 허용 여부가 달라지는 것에 대한 귀하의 우려를 확인했습니다.해결 방법이 효과가 있을 것입니다.그러나 그것은 당신에게 약간의 이득을 주는 단지 외관상의 변화일 뿐입니다.이 경우 코드를 변경하는 것보다 직접 변경하는 것이 좋습니다.기존 규칙에 자신을 맞추려고 노력하십시오.

편집하다:때로는 일반 코드에서 값을 선택 사항으로 만들 수 있어야 합니다.이 경우 일부 사용자 정의 옵션 유형을 사용해야 합니다.경험을 통해 나는 이것이 사용하기 매우 불쾌하다는 것을 알 수 있습니다.그것은 내가 선택한 솔루션이 아닙니다.

다른 팁

참조 유형은 다음과 같습니다. 이미 nullable, 효과적으로 - 사용하는 경우 int?, decimal? 그리고 string 그러면 모든 속성이 null이 될 수 있습니다.

문제는 당신이 string null 참조에 대한 값 - null이 사실상 유효한 값인 경우 ~이다 세트.

당신은 확실히 ~할 수 있었다 쓰다 Maybe<T> 입력하지만 그럴지는 잘 모르겠습니다. - 그럴 것입니다. 아마 그냥 null을 사용하세요...다른 것 외에도 C# 관용구에 익숙한 코드를 읽는 다른 사람들에게는 더 친숙할 것입니다.주변의 모든 "무효화 반대" 정서에 대해(나는 하다 많은 상황에서 공유) 가장 간단한 접근 방식인 경우도 있습니다.

나는 어떤 속성이 널리 잡힐 수 있고 (값 유형), 일부 (참조 유형)를 가지고 있다는 아이디어를 정말 좋아하지 않습니다.

참조 유형은 분명히 null을 허용합니다.

string t = null; //is totally valid

Nullable은 바로 이러한 목적으로 사용하고 싶은 것입니다.필요한 경우 확인하기 위한 "설정되어 있는지" 메서드와 함께 클래스가 외부에 일반 값을 표시하도록 속성으로 멤버를 래핑할 수 있습니다.하지만 내부에서는 Nullable을 사용합니다.

새로운 것을 제안하기 위해 ...제한된 수의 구성원이 있는 Update와 같은 하나의 클래스에 대해서만 이야기하는 경우 IsSet만 사용합니다.

하지만 만약 당신이 즉이 동작을 가진 유사한 클래스가 많거나 t4 템플릿 사용을 제안할 수 있는 많은 속성이 있습니다.예를 들어 설명된 대로 클래스 속성(필요한 유형 또는 속성)을 얻을 수 있습니다. 이 기사에서 속성 목록을 기반으로 코드 자동 생성(원하는 디자인 자동 구현)

관심 있는 사람이 있다면 더 자세히 설명할 수 있겠네요...

여기에 대한 해결책은

  • null이 유효한 옵션이 아닌 경우 nullable을 사용하세요.
  • null이 유효한 옵션이지만 주어진 값이 발생하지 않을 것이라고 확신하는 경우 기본값을 사용하십시오.
  • null이 유효한 값이고 절대 사용되지 않을 기본값의 이름을 지정할 수 없는 각 속성에 대해 부울 플래그를 사용하세요.

예:수량은 null이 허용되어야 합니다. 왜냐하면 수량을 설정하면 값이 null이 되지 않기 때문입니다.

Name이 null일 수 있고(이름이 없음) Name이 ""가 될 수 없다고 확신하는 경우 Name의 기본값은 ""로 설정되어야 합니다.

플래그, 예를 들어 Name이 null 값을 가질 수 있고 기본값을 생각할 수 없는 경우 nameSet을 사용해야 한다고 가정해 보겠습니다.이 플래그는 기본적으로 false이며 처음으로 Name 값을 설정할 때 플래그도 true로 설정되어야 합니다.

모든 속성을 동일한 방식으로 처리하려는 경우 Object 및 부울 플래그를 포함하는 클래스를 만드는 것이 해결책입니다.객체는 속성 값을 저장하고 플래그는 속성이 초기화되었는지 여부를 저장하지만 필요하지 않더라도 부울 플래그를 생성하기 때문에 마음에 들지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top