#c# #.net #visual-studio #fxcop
#c# #.net #visual-studio #fxcop
Вопрос:
Допустим, у меня есть класс A, который создает экземпляр класса B. класс B имеет конструктор и несколько методов инициализации (принудительно через интерфейс класса). Как написать правило fxcop, чтобы проверить, вызывается ли хотя бы один метод init после создания экземпляра B.
Что, если вы загрузите его во время выполнения из Интернета, вы не сможете использовать конструктор, поэтому инициализация.
Комментарии:
1. Как насчет исправления ошибки проектирования вместо этого? Объект должен быть готов к использованию при создании
2. Что, если вы загрузите его во время выполнения из Интернета, вы не сможете использовать constructor!
3. @user310291: пожалуйста, из любопытства, можете ли вы предоставить пример кода, в котором вы действительно можете использовать объект, не имея возможности его сконструировать?
4. @Rune FS: это дешевый ответ. В идеале вы хотели бы иметь возможность выполнять всю инициализацию через конструктор. Но иногда инициализацию приходится отложить из-за того, как объекты должны взаимодействовать с другим кодом.
5. @siride или вы подождете с построением, пока не получите всю необходимую информацию. И я написал не конструктор, а конструкцию, возможно, вы захотите использовать инициализатор, но если это требуется , перенесите вызов конструктора и инициализатора в фабричный метод.
Ответ №1:
Такого рода правила практически невозможно написать, за исключением самых тривиальных случаев. Например, если вы хотите убедиться, что метод инициализации B вызывается сразу после вызова конструктора B, это можно сделать относительно легко (хотя логика ветвления может вызвать проблемы даже там). Однако не было бы большой необходимости в отдельном методе init, если бы требовалось только поддерживать такое тривиальное использование. Что, как правило, более интересно обнаружить, так это случаи, когда кто-то пытается сделать что-то еще с экземпляром B перед вызовом его метода init , а это на самом деле не работа для статического верификатора, такого как FxCop.
Рассматривали ли вы возможность создания исключения из B, если оно не инициализировано при входе в другой метод (аналогично тому, как можно создать исключение ObjectDisposedException из удаленного экземпляра)?