문제

상당히 사소한 문제인데 이에 대한 사람들의 의견이 궁금합니다.

속성을 통해 액세스할 수 있는 사전이 있는 경우 해당 속성에 대해 다음 중 어떤 형식을 선호합니까?

/// <summary>
/// This class's FirstProperty property
/// </summary>
[DefaultValue("myValue")]
public string FirstProperty {
    get {
        return Dictionary["myKey"];
    }
    set {
        Dictionary["myKey"] = value;
    }

아마도 이것이 일반적인 방법일 것입니다.상당히 효율적이고 이해하기 쉽습니다.유일한 단점은 더 길거나 더 복잡한 키를 사용하면 철자를 틀리거나 하나의 인스턴스 또는 다른 것만 변경할 수 있다는 것입니다. 이로 인해 다음과 같은 결과가 발생합니다.

/// <summary>
/// This class's SecondProperty property
/// </summary>
[DefaultValue("myValue")]
private const string DICT_MYKEY = "myKey"
public string SecondProperty {
    get {
        return Dictionary[DICT_MYKEY];
    }
    set {
        Dictionary[DICT_MYKEY] = value;
    }

이는 약간 더 복잡하지만 추가적인 안전성을 제공하는 것으로 보이며 제가 생각하는 "코드 완성" 솔루션에 더 가깝습니다.단점은 이미 속성 위에 /// 블록과 [DefaultValue()] 블록이 있으면 그 부분이 약간 복잡해지기 시작한다는 것입니다.

그렇다면 어느 것이 더 마음에 드나요? 그리고 그 이유는 무엇인가요?누구든지 더 좋은 아이디어가 있습니까?

도움이 되었습니까?

해결책

나는 순전히 코드에서 마법 문자열/숫자를 피하는 것이 좋은 것이기 때문에 두 번째 것을 좋아합니다.IMO에서는 코드에서 숫자 또는 문자열 리터럴을 두 번 이상 참조해야 하는 경우 상수여야 합니다.대부분의 경우 한 번만 사용하더라도 상수로 유지되어야 합니다.

다른 팁

나는 순전히 까다로운 관점에서 @Glenn의 의견에 동의합니다.대답은 당신에게 맞는 것입니다.이 코드는 모두 10줄로 구성됩니다(생략된 마지막 중괄호를 포함하는 경우).아무도 길을 잃지 않을 것이며 잘못 입력할 가능성은 매우 희박합니다(불가능하지는 않지만 매우 희박합니다).반면에 다른 곳에서 키를 사용한 경우 반드시 상수를 사용하세요.

개인적으로 나는 당신의 중괄호 스타일에 대해 이야기하고 싶습니다.:) 농담이에요!정말 스타일의 문제입니다.

이것은 귀하의 질문에 대한 답변은 아니지만 "DefaultValue"가 귀하가 생각하는 의미를 의미한다고 생각하지 않습니다.속성의 기본값을 설정하지 않습니다.

보다 MSDN 그리고 이 질문 상세 사항은.

두 번 이상 사용된 값은 상수로 리팩터링되어야 하기 때문에 많은 사람들은 아마도 두 번째 옵션이 "올바르다"고 주장할 것입니다.나는 아마도 첫 번째 옵션을 사용할 것이다.강력한 유형의 속성에 사전 항목을 캡슐화하여 이미 "코드 완성" 솔루션에 가까워졌습니다.이렇게 하면 구현 시 잘못된 사전 항목을 검색하는 문제가 발생할 가능성이 줄어듭니다.getter 및 setter에서 "myKey"를 잘못 입력할 수 있는 곳은 단 2곳뿐이며 이는 매우 쉽게 발견할 수 있습니다.

두 번째 옵션은 너무 지저분해질 것입니다.

당신처럼 하나의 컨텍스트에서만 마법의 문자열을 사용한다면 괜찮을 것 같습니다.
하지만 수업의 다른 부분에서 키를 사용해야 한다면 const.

속성 이름을 키까지 일치시키고 리플렉션을 사용하여 조회 이름을 얻을 수 있습니다.

public string FirstProperty {
get {
    return Dictionary[PropertyName()];
}
set {
    Dictionary[PropertyName()] = value;
}

private string PropertyName()
{
    return new StackFrame(1).GetMethod().Name.Substring(4);
}

여기에는 모든 속성 구현을 동일하게 만드는 추가 이점이 있으므로 원하는 경우 Visual Studio에서 코드 조각으로 설정할 수 있습니다.

@Joel 당신은 StackFrame에 의존하고 싶지 않습니다. 인라이닝 예상치 못한 순간에 하루를 망칠 수 있습니다.

그러나 질문에 :어느 쪽이든 별로 중요하지 않습니다.

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