2013-04-16 4 views
1

나는 상수 데이터의 컬렉션을 포함하는 유형이 있습니다. 상수는 내 프로그램 외부에서 정의 된 표준에 의해 정의됩니다. 형식은 다음과 같습니다.FxCop에 유형이 변경되지 않는다고 알려주는 방법이 있습니까?

public class IAmImmutable 
{ 
    public IAmImmutable(string member1, string member2) 
    { 
     this.Member1 = member1; 
     this.Member2 = member2; 
    } 

    public string Member1 { get; private set; } 

    public string Member2 { get; private set; } 

    public static readonly Instance1 = new IAmImmutable("abc", "def"); 
    public static readonly Instance2 = new IAmImmutable("example", "data"); 
    public static readonly Instance3 = new IAmImmutable("for", "stackoverflow"); 
    public static readonly Instance4 = new IAmImmutable("these are", "constant fields"); 
    public static readonly Instance5 = new IAmImmutable("42", "1729"); 
    /* ... */ 
    public static readonly Instance1000 = new IAmImmutable("HUNGRY EVIL", "ZOMBIES"); 
} 

이 결과로 FxCop에서 수천 개의 CA2104:DoNotDeclareReadOnlyMutableReferenceTypes이 검색되었습니다. 이 탐지의 메모는 표시된 유형이 변경 불가능한 경우 검색을 억제해야 함을 나타냅니다 (이 경우). 그러나, 나는 그것을 피할 수 있으면 수천, 수천 개의 억압을 갖고 싶지 않습니다.

이 유형을 불변으로 표시 할 수 있습니까? 따라서이 감지가 발생하지 않도록 할 수 있습니까?

+0

http://blogs.msdn.com/b/codeanalysis/archive/2006/04/04/faq-how-do-i-indicate-to-donotdeclarerereadmutablereferencetypes-that-a-type-is-immutable-david -kean.aspx –

+0

참조 http://stackoverflow.com/questions/2274412/immutable-readonly-reference-types-fxcop-violation-do-not-declare-read-only-m –

+0

@Peter : 그 질문은 내부 변경 멤버를 포함하는 불변 타입. 이 유형에는 내부 변경 멤버가 없습니다. 내부에'StringBuilder'가 있다면 그것은 완전히 다른 질문이 될 것입니다. –

답변

2

MSDN에서이 작업을 수행하는 방법을 설명하는 문서를 참조하십시오.

FxCop은 "불변"이라고 생각해야하는 유형의 텍스트 파일을 ImmutableTypes.txt으로 찾습니다.

명시 적으로 변경하지 않아도 클래스가 내부에서 변경할 수 있습니다.

public IAmImmutable(string member1, string member2) 
{ 
    this._Member1 = member1; 
    this._Member2 = member2; 
} 

private readonly string _Member1; 
private readonly string _Member2; 

public string Member1 { get {return _Member1;} } 
public string Member2 { get {return _Member2;} } 

(의 FxCop은 "불변"클래스로이 인식하든 또 다른 질문입니다) : 이 불변 할 것이라고 한 변화의 속성을 변경하는 것입니다 얻을 전용으로 읽기 전용 필드로 백업 속성을 자동 구현

string이 불변이므로이 점에 유의하십시오. 변경 가능한 유형 (예 : List 또는 Array)으로 변경 한 경우 참조이 읽기 ​​전용이지만 내용이 일 수 있으므로 클래스 자체를 변경할 수 있습니다.

+0

음 ... "FxCop Project File"이 없습니다. (???) –

+0

@D Stanley :별로. 읽기 전용을 추가하면 해당 클래스의 컴파일 타임에 모든 항목이 적용됩니다. 미래에 클래스에 돌연변이 구성원을 추가하는 경우에는 해당 구성원을 추가하고'readonly'를 제거 할 수 있습니다. 그것은 큰 변화가 아닐 것이다. 물론, 이는 미묘하게 "자유 스레딩"을 기대하는 코드를 깨뜨릴 수 있지만 프레임 워크는 불평하지 않을 것입니다. –

+0

필드가 가변 참조 유형이라는 사실은 필드에 의해 캡슐화 된 정보가 실제로 변경 될 수있는 실행 경로가 없으면 클래스가 변경 가능하다는 것을 의미하지 않습니다. 간단한 예로, 개체 생성자가 5 개의 정수 배열을 만들고 그 값을 채운 다음 개인 필드에 참조를 저장하는 경우 해당 배열을 변경할 수있는 것으로 배열을 노출하지 않으면 클래스는 불변 (적어도 배열에 관한 한). 또한, 필드에 의해 참조되는 것이 정체성임을 알면 ... – supercat