문제

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에 추가 된 지침 규칙 일뿐입니다.

분명히 페이지 클래스의 맥락 밖에서 사용될 수있는 중첩 클래스의 아이디어가 마음에 들지 않습니다.

나는 원칙적으로 원칙적으로 그것에 동의하지만, 그것이 바람직한 곳을 상상할 수 있습니다.

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