C #: Частичные методы и Action, не реализованное тело - PullRequest
2 голосов
/ 17 декабря 2010

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

  public partial class MyClass  {

      AnotherClass _anotherClass;

      public MyClass  () {
         _anotherClass = new AnotherClass();
         _anotherClass.Method = new Action(() => {            
            this.Method(); 
         });
      }

      partial void Method();

      //sometimes this method will be implemented
      //partial void Method() {
         //do something
      //}
   }

   public class AnotherClass {

      public Action Method { get; set;}

      public void SomeOtherMethod(){
         this.Method();
      }
   }

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

Мой вопрос касается случаев, когда частичный метод Method() не реализован. Когда вызывается метод Action, компилятор оптимизирует его, так как его тело пусто? Если я получу кучу сделанных вызовов Action, могу ли я потерять производительность? Есть ли лучший способ получить такую ​​же функциональность?

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

Per, MSDN (выделение добавлено):

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

Таким образом, нет реального штрафа, так как звонки оптимизированы.

0 голосов
/ 17 декабря 2010

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

Итак, я бы выбрал решение для событий, потому что я думаю, что другие разработчики .NET, которые работают над кодом после васбудет более знаком с решением, а не с экзотическим частичным методом, который вы представите.

...