Pergunta

Eu estou correndo de análise estática de código com o FxCop 1.36 e eu continuo recebendo aviso CA1034:NestedTypesShouldNotBeVisible.

Gostaria de entender se a classe pai foram declarados como interna ou privada, mas é público.Por que seria ruim para TimerReset ser declarados como públicos?

Eu estou faltando alguma coisa, ou isso é algo que pode ser ignorado?

Obrigado por qualquer de entrada!

Aqui está um trecho do código, fazendo com que este aviso:

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);
                }
            }
        }
    }
}
Foi útil?

Solução

Geralmente falando, os Tipos Aninhados são mais difíceis de 'descobrir'.

E. g.Para utilizar o seu tipo aninhado, vou ter que escrever seguinte

Page.TimerResetDelegate timer = new Page.TimerResetDelegate();

Apesar acima é válida código C#, ele não lê como o tipo mais comum de utilização.

Tipos aninhados são geralmente usadas quando você deseja definir um tipo para ser usado internamente e você iria evitar de código como o acima.Esta é a razão pela qual o FxCop é dando-lhe aviso.Se você quiser, você pode ignorá-lo.Pessoalmente, eu gostaria de manter meu tipos Aninhados como privado.Se eu esperar chamador para fazer uso do tipo, eu vou movê-los para um bom espaço de nomes.

Outras dicas

É porque seu delegado é um tipo, mas é definido na classe Page. Eu apenas o definiria na empresa. Se você estivesse escrevendo uma API, isso ficaria um pouco confuso, isso é tudo.

Além disso, é um pouco estranho devolver o delegado assim, mas acho que realmente não sei o que você está tentando realizar.

Por que seria ruim para TimerReset ser declarados como públicos?

Exatamente como o descrição de estados:

Tipos aninhados são úteis para encapsular implementação particular detalhes do que contém o tipo.Utilizado para esta finalidade, tipos aninhados não deve ser visível externamente.

Uma vez que você está expondo TimerResetDelegate publicamente com TimerReset, Eu acho que não é um detalhe de implementação.

Não use visível externamente tipos aninhados para agrupamento lógico ou para evitar conflitos de nome;em vez disso, utilize espaços de nomes.

O que faz parecer que você está usando um tipo aninhado para o agrupamento.Como o FxCop estados, utilizar um espaço de nomes em vez disso.

Tipos aninhados incluem a noção de membro de acessibilidade, que alguns programadores não entendem claramente.

Desde TimerResetDelegate é um delegado, este não se aplica.

Mover TimerResetDelegate a própria TimeResetDelegate.cs arquivo e colocá-lo em seu Company.App.Thing espaço de nomes.Então, ele não é mais aninhadas.

Claro, seria ainda melhor para apenas ir com o EventHandler em vez de definir o seu próprio tipo de delegado.

IMHO, esta é uma regra do FXCOP que pode ser ignorada.

Não há nada de errado em um nível de CLR em ter uma aula aninhada. É apenas uma regra de diretrizes adicionada ao FXCOP, porque os autores achavam que era menos utilizável ou um design mais pobre do que tornar a classe não aninhada.

Aparentemente, não gosta da idéia de aulas aninhadas, quando elas podem ser usadas fora do contexto da sua aula de página.

Pessoalmente, concordo com isso em princípio, embora possa imaginar algumas exceções em que isso pode ser desejável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top