2012-01-31 3 views
3
public Dictionary<string, string> Data { get; set; } 

위의 코드 줄에서는 스타일 복제 오류가 발생합니다. CA2227 컬렉션 속성은 읽기 전용이어야합니다.사전을 사용하여 CA2227은 무엇입니까?

Stylecop 억제를 추가하거나 자신의 읽기 전용 사전 클래스를 만들지 않고이 오류를 지나갈 수있는 방법이 있습니까?

답변

7

"set"키워드 만 제거하면됩니다. 다음과 같이 설정하십시오.

private readonly Dictionary<string, string> data = new Dictionary<string, string>(); 

public Dictionary<string, string> Data { get { return this.data; } } 

종종 컬렉션을 재 할당 할 필요는 없지만 기존 컬렉션을 지울 수는 있습니다. 나는 그것이이 경고의 출처라고 생각합니다. 위의 샘플은 제가 대부분의 시간을 사용하고있는 접근법입니다.

+0

감사합니다. 나는 그와 비슷한 것을 시도했지만, 그 당시에는 하나도 가지지 않았습니다! – DevDave

3

확실하지만, 다음과 같은 오류 억제 할 수 없음 :

public Dictionary<string, string> Data { get; private set; } 

정직하기를, 그것 때문에 스타일의 사람의 주관적 생각 (일명 StyleCop와의 FxCop)에 개발을 방해하는 바보입니다.

+3

동의하지 않습니다. 스타일 캅과 FxCop은 훌륭합니다. FxCop의 모든 위반 사항을 수정하는 것은 바보입니다 (개발 팀이 선택한 모든 스타일 룰을 수정하는 것은 좋은 아이디어 임). 그러나 생성 된 경고를 이해하는 것은 항상 ** 좋은 생각입니다. – ken2k

+0

나는 이것을 시도했지만 CA1811 : set에는 상류의 대중이나 보호 된 발신자가없는 것 같습니다. 오, 내가 스타일/Fx 경찰을 얼마나 좋아하는지! – DevDave

+0

@ ken2k : 그건 ** 당신의 의견입니다. 내 것은 다르다. 컴파일러 경고는 항상 좋은 것입니다. – leppie

2

이것은 StyleCop이 아니라 코드 분석 (이전에 FxCop이라고 함) 경고입니다. 그리고 이것은 CA2227이 아니라 CA2227입니다.

this MSDN article을 참조하십시오.이 내용은 문제에 대해 자명합니다.

는 그것을 해결하기 위해 다음 (개인 세터)를보십시오 :

public Dictionary<string, string> Data { get; private set; } 
+0

예기치 않은 코드와 잘못된 경찰으로 유감스럽게 생각합니다! – DevDave

2

내가 CA2227 당신이 읽기 전용 Dictionary<,>를 제공하도록 요청합니다 생각하지 않습니다. 오히려 StyleCop은 사전을 직접 설정할 수 있다고 불평합니다. 세터를 제거하거나 비공개로 설정하여 경고를 없애야합니다. 또한 수업은 자신의 AddClear 방법을 제공 할 수 있습니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/ms182327%28VS.80%29.aspx을 참조하십시오.

0

이 권장 사항/경고에서 발견 한 문제는 "수정"하는 개발자가 종종 원본 컬렉션에 대한 참조를 사용하는 대신 불필요한 복사본을 코딩하는 경우가 많다는 것입니다. 예를 들어, 나는 다음 줄이 :

myThing.Items = GetItems(); 

을 그리고 DEV는 그것을 해결)

var items = GetItems(); 

foreach (var item in items) 
{ 
    myThing.Items.Add(item); 
} 

(GetItems을 상상 만 항목의 컬렉션을 반환합니다. 어떻게 이것이 좋은 일이 될 수 있습니까? Microsoft는 "이 규칙에서 경고를 제외하지 마십시오"라는 문구를 발견했습니다. MSDN에서 조금 강하게!

관련 문제