29 января 2010

Существенно ли?

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

Т.е. "естественная" реализация:


  1. enum SomeEnum {...}
  2.  
  3. class BaseClass()
  4. {
  5.     public virtual IEnumerable<SomeEnum> GetValueSet()
  6.     {
  7.         return new SomeEnum[] { SomeEnum.Value1, SomeEnum.Value2 };
  8.     }
  9. }
* This source code was highlighted with Source Code Highlighter.

"Оптимизированная" реализация:


  1. enum SomeEnum {...}
  2.  
  3. class BaseClass()
  4. {
  5.     private static readonly SomeEnum[] valueSet1 = new[] { SomeEnum.Value1, SomeEnum.Value2 };
  6.     public virtual IEnumerable<SomeEnum> GetValueSet()
  7.     {
  8.         return valueSet1;
  9.     }
  10. }
  11.  
  12. class ChildClass() : BaseClass
  13. {
  14.     private static readonly SomeEnum[] valueSet2 = new[] { SomeEnum.Value3, SomeEnum.Value4 };
  15.     public override IEnumerable<SomeEnum> GetValueSet()
  16.     {
  17.         return valueSet2;
  18.     }
  19. }
* This source code was highlighted with Source Code Highlighter.

Или все-таки оптимизатора в данном случае следует считать параноиком, усилия которого .NET съест с большим аппетитом (равно как и GC съест возвращенные экземпляры массивов), и такие оптимизации как мертвому припарки?

2 комментария:

Ilya Veselov комментирует...

Если код не вызывается по 1000 раз в секунду, то вообще пофиг. Иначе GC может не успевать освобождать ресурсы. А вообще, лучше профилировать :)

Ilya Veselov комментирует...

Хотя, он же value type, значит вообще пофиг. Возвращаться-то всё равно будет копия - новая или поля - без разницы.