Существует ли более эффективный подход, чем делегаты C # Action, для избежания такого дублирования кода? - PullRequest
4 голосов
/ 22 марта 2012

Как можно больше хочу избежать ненужного дублирования кода.В моем сценарии, описанном ниже, я использовал Action делегатов, чтобы избежать дублирования кода.Однако при использовании подхода делегата Action код становится примерно на 50-80% медленнее.

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

У меня есть два метода, которые эквивалентны, за исключением самого внутреннего утверждениядлинный цикл:

public T[] MethodA<T>(T[] from)
{
  ...
  for (var i = 0; i < len; ++i)
  {
    var j = GetIndex(i);
    to[j] = from[i];    // This statement differs in MethodA and MethodB
  }
  ...
  return to;
}

public T[] MethodB<T>(T[] from)
{
  ...
  for (var i = 0; i < len; ++i)
  {
    var j = GetIndex(i);
    to[i] = from[j];    // This statement differs in MethodA and MethodB
  }
  ...
  return to;
}

Чтобы избежать дублирования кода, я реализовал вспомогательный метод, который принимает делегат Action.Вызов делегата заменяет оператор переменной следующим образом:

private T[] HelperMethod<T>(T[], Action<T[], T[], int, int> action)
{
  ...
  for (var i = 0; i < len; ++i)
  {
    var j = GetIndex(i);
    action(from, to, i, j);    // Invoke the Action delegate
  }
  ...
  return to;
}

Тогда я могу уменьшить MethodA и MethodB следующим образом:

public T[] MethodA<T>(T[] from)
{
  return HelperMethod(from, (src, dest, src_idx, dest_idx) => dest[dest_idx] = src[src_idx]);
}

public T[] MethodB<T>(T[] from)
{
  return HelperMethod(from, (src, dest, dest_idx, src_idx) => dest[dest_idx] = src[src_idx]);
}

Обратите внимание, что единственная разница междуизмененные MethodA и MethodB - это порядок src_idx и dest_idx в Action сигнатурах HelperMethod вызовов.

1 Ответ

1 голос
/ 22 марта 2012

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

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