FXCOP -CA1034 오류 - 왜?
-
19-09-2019 - |
문제
FXCOP 1.36으로 정적 코드 분석을 실행하고 있으며 계속받습니다. 경고 CA1034: NestedTypesshouldNotBevisible.
부모 클래스가 내부 또는 개인으로 선언되었는지 이해하지만 공개적입니다. Timerreset이 대중으로 선언하는 것이 왜 나쁜지?
내가 뭔가를 놓치고 있습니까, 아니면 무시할 수있는 것입니까?
입력에 감사드립니다!
다음은이 경고를 일으키는 코드의 발췌문입니다.
namespace Company.App.Thing
{
public partial class Page : XtraPage
{
public delegate void TimerResetDelegate(object sender, EventArgs e);
private TimerResetDelegate _timerReset;
public Page()
{
InitializeComponent();
}
public TimerResetDelegate TimerReset
{
set
{
if (null != (_timerReset = value))
{
checkBox.Click += new EventHandler(_timerReset);
textField.Click += new EventHandler(_timerReset);
textField.KeyDown += new KeyEventHandler(_timerReset);
TimeField.Click += new EventHandler(_timerReset);
TimeField.KeyDown += new KeyEventHandler(_timerReset);
}
}
}
}
}
해결책
일반적으로 중첩 된 유형은 '발견'하기가 더 어렵습니다.
예를 들어 중첩 된 유형을 사용하려면 다음을 작성해야합니다.
Page.TimerResetDelegate timer = new Page.TimerResetDelegate();
위는 유효한 C# 코드이지만 일반적인 유형 사용법과 같이 읽지 않습니다.
중첩 유형은 일반적으로 내부적으로 사용할 유형을 정의하려고 할 때 일반적으로 사용되며 위와 같은 코드를 피할 수 있습니다. 이것이 FXCOP가 경고를하는 이유입니다. 원한다면 무시할 수 있습니다. 개인적으로, 나는 내 중첩 유형을 비공개로 유지할 것입니다. 발신자가 유형을 활용할 것으로 예상되면 적절한 네임 스페이스로 이동합니다.
다른 팁
대의원이 유형이기 때문에 페이지 클래스 내에서 정의됩니다. 나는 단지 회사에서 그것을 정의 할 것입니다. 당신이 API를 쓰고 있다면 그것은 조금 지저분하게 만들 것입니다. 그게 전부입니다.
또한, 대의원을 그렇게 돌려주는 것은 조금 이상하지만, 나는 당신이 무엇을 성취하려고하는지 정말로 모른다고 생각합니다.
Timerreset이 대중으로 선언하는 것이 왜 나쁜지?
정확히 설명 상태:
중첩 유형은 포함 유형의 개인 구현 세부 사항을 캡슐화하는 데 유용합니다. 이 목적으로 사용되는 중첩 유형은 외부로 보이지 않아야합니다.
당신이 노출하기 때문에 TimerResetDelegate
공개적으로 TimerReset
, 나는 그것이 구현 세부 사항이 아니라고 생각합니다.
논리 그룹화를 위해 외부 가시적 중첩 유형을 사용하거나 이름 충돌을 피하기 위해 사용하지 마십시오. 대신 네임 스페이스를 사용하십시오.
그룹화에 중첩 된 유형을 사용하는 것처럼 보입니다. FXCOP 상태로서 대신 네임 스페이스를 사용하십시오.
중첩 된 유형에는 회원 접근성 개념이 포함되어 있으며 일부 프로그래머는 명확하게 이해하지 못합니다.
부터 TimerResetDelegate
대의원입니다. 이것은 실제로 적용되지 않습니다.
이동하다 TimerResetDelegate
자체 TIMERESETDELEGATE.CS 파일에 넣고 Company.App.Thing
네임 스페이스. 그런 다음 더 이상 중첩되지 않습니다.
물론, 그냥 함께가는 것이 더 좋을 것입니다. 이벤트 핸들러 자신의 대의원 유형을 정의하는 대신.
IMHO, 이것은 무시할 수있는 FXCOP 규칙입니다.
중첩 된 클래스가있는 CLR 수준에서는 아무런 문제가 없습니다. 저자는 클래스를 네 베스트로 만드는 것보다 유용하기 쉽지 않거나 디자인이 좋지 않다고 생각했기 때문에 FXCOP에 추가 된 지침 규칙 일뿐입니다.
분명히 페이지 클래스의 맥락 밖에서 사용될 수있는 중첩 클래스의 아이디어가 마음에 들지 않습니다.
나는 원칙적으로 원칙적으로 그것에 동의하지만, 그것이 바람직한 곳을 상상할 수 있습니다.