Поделиться через


CA1034: вложенные типы не должны быть видимыми

TypeName

NestedTypesShouldNotBeVisible

CheckId

CA1034

Категория

Microsoft.Design

Критическое изменение

Критическое изменение

Причина

Видимый для внешнего кода тип содержит объявление видимого для внешнего кода типа. Данное правило не распространяется на вложенные перечислители и защищенные типы.

Описание правила

Вложенный тип — это тип, объявленный внутри области видимости другого типа. Вложенные типы удобно использовать для инкапсуляции закрытых сведений о реализациях содержащего их типа. В силу этого вложенные типы не должны быть видимыми для внешнего кода.

Не следует использовать видимые для внешнего кода вложенные типы для логической группировки или с целью предотвращения конфликтов имен. Для эти целей лучше применять пространства имен.

Некоторые программисты не всегда имеют четкое представление о доступности членов вложенных типов.

Защищенные типы можно использовать в подклассах, а вложенные типы — в скриптах расширенной настройки.

Устранение нарушений

Если вложенный тип не предназначен для доступа со стороны внешнего кода, измените видимость этого типа. В противном случае удалите вложенный тип из родительского типа. Если целью вложения является категоризация вложенных типов, используйте для создания иерархии пространство имен.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан тип, который нарушает данное правило.

Imports System

Namespace DesignLibrary

    Class ParentType

        Public Class NestedType
            Sub New()
            End Sub
        End Class

        Sub New()
        End Sub

    End Class

End Namespace
using System;

namespace DesignLibrary
{
    internal class ParentType
    {
        public class NestedType
        {
            public NestedType()
            {
            }
        }

        public ParentType()
        {
            NestedType nt = new NestedType();
        }
    }
}
using namespace System;

namespace DesignLibrary
{
    public ref class ParentType
    {
    public:
        ref class NestedType
        {
        public:
            NestedType()
            {
            }
        };

        ParentType()
        {
            NestedType^ nt = gcnew NestedType();
        }
    };
}