Когда Вы хотели бы вложить классы в C#? [дубликат]

Добавьте условие на действии, таким образом, оно только инициировано во время установки, не удаления.

Действие, выполненное только во время Установки

NOT Installed AND NOT PATCH

, Действие работает во время Установки и восстановления

NOT REMOVE

Работавший начальная установка только:

NOT Installed

Работавший начальная установка или когда восстановление выбрано.

NOT Installed OR MaintenanceMode="Modify"

, Чтобы только выполнить действие во время удаления используют следующее условие:

REMOVE~="ALL"

, Чтобы только выполнить действие во время обновления:

Installed AND NOT REMOVE
9
задан John Bubriski 15 September 2009 в 15:42
поделиться

9 ответов

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

другим примером может быть перечисление для заменить параметр true false, используемый методом в классе, чтобы уточнить сигнатуру вызова ...

вместо

public class Product
{
    public void AmountInInventory(int warehouseId, bool includeReturns)
    {
        int totalCount = CountOfNewItems();
        if (includeReturns)
            totalCount+= CountOfReturnedItems();
        return totalCount;
    }
}

и

  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, true);  

, что оставляет неясным, что означает «истина», вы можете написать:

public class Product
{
    [Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
    public void AmountInInventory(int warehouseId, Include include)
    {
        int totalCount = 0;
        if ((include & Include.New) == Include.New)
            totalCount += CountOfNewItems();
        if ((include & Include.Returns) == Include.Returns)
            totalCount += CountOfReturns();
        return totalCount;
    }
}


  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, Product.Include.All);  

Что очищает значение параметра в клиентском коде.

16
ответ дан 4 December 2019 в 06:14
поделиться

Два места, где я использую вложенные классы:

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

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

11
ответ дан 4 December 2019 в 06:14
поделиться

Я видел случаи вложенных классов, когда структура данных специального назначения используется только внутри одного класса или определенное исключение выбрасывается и перехватывается только внутри одного класса.

2
ответ дан 4 December 2019 в 06:14
поделиться

Я иногда использую это для простых вспомогательных классов, которые мне нужны для функции или двух внутри родительского класса.

3
ответ дан 4 December 2019 в 06:14
поделиться

По «правилам» дяди Боба по сплоченности должны обнаружить, что вы действительно создаете довольно много вложенных (и вложенных, вложенных!) классов. Эти можно сделать невложенными, но только , если у вас есть другие клиенты, которые ссылаются на них сейчас.

1
ответ дан 4 December 2019 в 06:14
поделиться

Я хотел бы улучшить свой предыдущий ответ!

Особая область, где я регулярно использую вложенные классы, - это включение внедрения интерфейса и инверсии управления. Пример ...

public class Worker
{
  private IHelper _helper;

  public Worker()
    : this (new DefaultHelper())
  {
  }
  public Worker(IHelper helper)
  {
    this._helper = helper;
  }

  private class DefaultHelper : IHelper
  {
  }
}
1
ответ дан 4 December 2019 в 06:14
поделиться

В качестве практического примера см. Вопрос, заданный ранее этим утром:
Сделать объект доступным только для одного другого объекта в той же сборке?

Резюме: вы можете вложить связанный класс данных внутри бизнес-объекта.

3
ответ дан 4 December 2019 в 06:14
поделиться

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

Например, если вам нужно было создать список из нескольких типов объектов, связанных вместе с функциями, и информацию о членах об этом наборе объектов на короткое время (например, методы или свойства), вы можете использовать для этого вложенный класс. . Может быть, вам нужно создать список всех комбинаций какого-либо типа объекта, а затем отметить все комбинации, которые имеют определенное свойство. Это был бы хороший случай для вложенного класса.

Если вам не нужны методы во вложенном классе, вы, вероятно, можете просто использовать struct , но я не знаю, обрабатывает ли IL их по-другому.

4
ответ дан 4 December 2019 в 06:14
поделиться

Я вкладываю классы, когда у меня есть вспомогательный класс, который не должен быть видимым для любого другого объекта в системе. Это сохраняет видимость как можно более ограниченной, что помогает предотвратить непреднамеренное использование класса

1
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

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