Почему/когда необходимо использовать вложенные классы в .NET? Или не были должны Вы?

Известная проблема с шаблонами - это раздувание кода, что является следствием генерации определения класса в каждом модуле, который вызывает специализацию шаблона класса. Чтобы предотвратить это, начиная с C ++ 0x, перед спецификацией шаблона класса

#include <MyClass> extern class CMyClass<int>;

можно использовать ключевое слово extern . Явное инкрементирование класса шаблона должно происходить только в одной единице перевода, предпочтительнее вариант с определением шаблона (MyClass.cpp)

template class CMyClass<int>;
template class CMyClass<float>;
91
задан ruffin 5 September 2019 в 21:13
поделиться

5 ответов

Используйте вложенный класс, когда класс, Вы - вложение, только полезен для класса включения. Например, вложенные классы позволяют Вам писать, что чему-то нравится (упрощенный):

public class SortedMap {
    private class TreeNode {
        TreeNode left;
        TreeNode right;
    }
}

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

, Если бы класс TreeNode был внешним, необходимо было бы или сделать все поля public или сделать набор get/set методы для использования его. Внешний мир имел бы другой класс, загрязняющий их intellisense.

94
ответ дан Brian 24 November 2019 в 06:50
поделиться

Если я понимаю право статьи Katheleen, она предлагает использовать вложенный класс, чтобы быть в состоянии записать SomeEntity. Набор вместо EntityCollection< SomeEntity>. По-моему, это - спорный способ сохранить Вас некоторый ввод. Я вполне уверен, который в наборах приложения реального мира будет иметь некоторое различие в реализациях, таким образом, необходимо будет создать отдельный класс так или иначе. Я думаю, что использование имени класса для ограничения другого объема класса не является хорошей идеей. Это загрязняет intellisense, и усильте зависимости между классами. Используя пространства имен стандартный способ управлять объемом классов. Однако я нахожу, что использование вложенных классов как в комментарии @hazzen приемлемо, если у Вас нет тонн вложенных классов, который является знаком плохого дизайна.

3
ответ дан aku 24 November 2019 в 06:50
поделиться

Это зависит от использования. Я редко когда-либо использовал бы вложенный класс Общественности, но использовать Частные вложенные классы все время. Частный вложенный класс может использоваться для подобъекта, который предназначается, чтобы использоваться только в родителе. Пример этого был бы то, если класс HashTable содержит частный объект Записи хранить данные внутренне только.

, Если класс предназначен, чтобы использоваться вызывающей стороной (внешне), мне обычно нравится делать его отдельным автономным классом.

5
ответ дан Chris Dail 24 November 2019 в 06:50
поделиться

Из Учебного руководства по Java Sun:

, Почему Использование Вложенные Классы? Существует несколько неопровержимых доводов использования вложенных классов среди них:

  • Это - способ логически группирующихся классов, которые только используются в одном месте.
  • Это увеличивает инкапсуляцию.
  • Вложенные классы могут привести к большему количеству читаемого и удобного в сопровождении кода.

Логическая группировка classes—, Если класс полезен только для еще одного класса, то логично встроить его в тот класс и держать два вместе. Вложение такие "классы помощника" делает их пакет более оптимизированным.

Увеличенные encapsulation— Рассматривают два класса верхнего уровня, A и B, где B нужен доступ к членам, который был бы иначе объявлен частный. Путем сокрытия класса B в классе A члены A могут быть объявлены частные, и B может получить доступ к ним. Кроме того, B самостоятельно может быть скрыт от внешнего мира. < - Это не относится к реализации C# вложенных классов, это только относится к Java.

[еще 118] читаемый, удобный в сопровождении code— Вложенные маленькие классы в классах верхнего уровня помещает код ближе туда, где это используется.

16
ответ дан Ben Baron 24 November 2019 в 06:50
поделиться

Полностью ленивый и потокобезопасный одноэлементный шаблон

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

источник: http://www.yoda.arachsys.com/csharp/singleton.html

9
ответ дан 24 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: