Класс, объявленный в другом классе в C#

Это невозможно с правилами безопасности. Вы должны предположить, что ваши пользователи могут получать доступ к вашей базе данных не только в вашем приложении, но и в веб-приложении, которое они собирают сами, или из FESTtore REST API .

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

47
задан Jeremy Cron 17 August 2009 в 19:04
поделиться

7 ответов

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

Класс y мог бы также быть посвящен в детали реализации класса x, которые не предназначены для знания общественности.

60
ответ дан Frederick The Fool 26 November 2019 в 19:37
поделиться

Это имеет последствия полномочий. "Класс y" верхнего уровня был бы "внутренним" - однако, здесь "y" является частным к "x". Этот подход полезен для деталей реализации (например, строки кэша и т.д.). Аналогично, y имеет доступ ко всему частному состоянию x.

Существуют также последствия с дженериками; x<T>.y универсально "T", наследованный от внешнего класса. Вы видите это здесь, где Bar имеет использование в полной мере T - и обратите внимание что любые статические поля Bar ограничены по объему на -T.

class Foo<T> {
    void Test(T value) {
        Bar bar = new Bar();
        bar.Value = value;
    }
    class Bar {
        public T Value { get; set; }
    }
}

Часто люди неправильно думают, что они должны определить Bar как Bar<T> - это теперь (эффективно) вдвойне универсально - т.е. Foo<TOld, T> - где TOld (теперь недоступен) T от Foo<T>. Не делайте этого! Или если Вы хотите, чтобы это было вдвойне универсально, выберите различные имена. К счастью, компилятор предупреждает Вас об этом...

20
ответ дан Marc Gravell 26 November 2019 в 19:37
поделиться

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

7
ответ дан Pawel Krakowiak 26 November 2019 в 19:37
поделиться

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

Если бы Y используется только в X и никогда не будет использоваться за пределами X, я сказал бы, сохраняют его там

2
ответ дан Dan McClain 26 November 2019 в 19:37
поделиться

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

2
ответ дан phatoni 26 November 2019 в 19:37
поделиться

Позвольте мне дать Вам пример использования вложенных классов, которые могли бы разъяснить, когда этот вид архитектуры является соответствующим. Я недавно должен был генерировать HTML-таблицу путем получения по запросу выбранных столбцов из таблицы данных и "поворота" их так, чтобы строки стали столбцами и наоборот. В моем случае было две существенных операции: вертясь данные и генерируя некоторый довольно комплексный выход (я только показывал данные: каждый столбец данных / строка таблицы подвергся операциям для извлечения заголовка, генерация тегов изображения, ссылки установки, и т.д. таким образом с помощью Центра SQL не были действительно правильными ни один).

После начальной попытки создать один класс, чтобы сделать все это, я распознал, что так большая часть данных/методов попала в три отличных раздела: обработка заголовка, обработка строки и поворот. Таким образом я решил, что лучший подход должен будет инкапсулировать логику для "заголовка" и "строки" в отдельные, вложенные классы. Это позволило мне разделять данные, сохраненные каждой строкой и программировать операции центра очень чисто (называющий отдельный объект строки для каждого столбца в Вашей таблице данных). В конце операций центра я генерировал произведенный путем вызова объекта заголовка и затем каждого объекта строки в свою очередь для генерации его вывода назад к основному классу.

Отдельные классы не были соответствующими потому что A) вложенным классам действительно были нужны некоторые данные из мастер-класса и B) обработка была очень конкретна и не полезна в другом месте. Просто программирование одного большого класса было просто более грязным из-за условий окружения беспорядка, таких как "столбец" и "строка", которая отличалась в зависимости от того, говорили ли Вы о выводе данных или выводе HTML. Кроме того, это было необычной работой, в которой я генерировал HTML в своем бизнес-классе, таким образом, я хотел разделить чистую бизнес-логику от поколения UI. В конце вложенные классы обеспечили идеальный баланс, затем, инкапсуляции и совместного использования данных.

2
ответ дан Mark Brittingham 26 November 2019 в 19:37
поделиться

Вы могли все еще осуществить рефакторинг свой класс y в другой файл, но использовать parial класс. Преимущество этого - то, что Вы все еще имеете один класс на файл и не имеете стычек рефакторинга перемещения объявления за пределами класса x.

например, у Вас мог быть файл кода: x.y.cs, который посмотрел бы что-то как

partial class X
{
    class Y
    {
        //implementation goes here
    }
} 
1
ответ дан Matthew Dresser 26 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

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