Вызов метода экземпляра из конструктора в C # - PullRequest
5 голосов
/ 14 октября 2011

У меня довольно длинный конструктор, который выполняет различные инициализационные работы, и поэтому я хотел разделить некоторые из этих работ на некоторые функции.Это заставило меня задуматься, должен ли я делать указанные функции экземплярами или статическими методами.Я понимаю риск вызова виртуальной функции из конструктора, но я также думаю, что что-то не так в вызове метода экземпляра для объекта, который не создан на 100%.Конечно, это противоречие в терминах.

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

public class A
{
   private readonly string _foo;

   public A()
   {  
       _foo = InitialiseFoo();
   }

   private static InitialiseFoo()
   {
       // Do stuff
       return new string ("foo");
   }
}

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

Это вполне нормально для вызова метода экземпляра в конструкторе, более того метода, который выполняет инициализациюВ общем, это своего рода Извлечение метода рефакторинг для сокращения тела метода конструктора, поэтому вы извлекаете часть инициализации в отдельный метод, и конструктор знает о сохранении входных аргументов и т. Д ...

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

public A() 
: base(GetLogger())
{
}

private static ILog GetLogger() ...
1 голос
/ 14 октября 2011

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

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

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