.NET: переключатель по сравнению со словарем для строковых ключей

Можно использовать дженерики для проверки (время компиляции), если аргумент метода реализует два интерфейса:

interface IPropA 
{
    string PropA { get; set; } 
}

interface IPropB 
{
    string PropB { get; set; }
}

class TestClass 
{
    void DoSomething<T>(T t) where T : IPropA, IPropB 
    {
        MessageBox.Show(t.PropA);
        MessageBox.Show(t.PropB);
    }
}

То же с аргументом, который наследован от базового класса и интерфейса.

11
задан Vilx- 26 August 2009 в 12:32
поделиться

3 ответа

switch:      good efficiency, least maintainable
dictionary:  good efficiency, better maintainability
reflection:  least efficient, best maintainability

Подсказка: игнорируйте эффективность и беспокойтесь только о ремонтопригодности, если вы на самом деле не проверили производительность и не обнаружили, что это проблема.

Я не говорю, что отражение - ваш единственный выбор, просто что это позволит вам добавлять / удалять и переименовывать свойства по мере необходимости, и вам не нужно синхронизировать оператор switch или словарь.

21
ответ дан 3 December 2019 в 03:18
поделиться

Поскольку вы используете строки Dictionary, вероятно, будет быстрее. Переключатель по существу будет переведен в хеш-таблицу при использовании строк. Но если вы используете int или что-то подобное, он преобразуется в таблицу переходов и будет работать быстрее.

см. этот ответ и вопрос для более подробной информации

Лучше всего профилировать его и найти наверняка

7
ответ дан 3 December 2019 в 03:18
поделиться

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

Позвольте мне привести пример: скажем, у вас есть следующая реализация:

private string _latestFieldName = string.Empty;
private PropertyInfo _propertyInfo;

object GetFieldValue(string FieldName)
{
  if(FieldName != _latestFieldName)
  {
    _propertyInfo = typeof(yourTypeName).GetProperty(FieldName);
  }
  return _propertyInfo.GetValue(this,null);
}

Если рендеринг вашей сетки рендерит строку за раз с использованием отражения, он должен будет каждый раз получать информацию о свойстве. Если вы визуализируете столбец за столбцом, вам нужно будет получить свойство propertyInfo только один раз для каждого свойства, и поскольку прогноз ветвления будет правильным почти каждый раз, вы пропустите только несколько тактов в if. Когда у вас уже есть PropertyInfo и вам не нужно приводить результат вызова к GetValue. Использование отражения ОЧЕНЬ близко к использованию получателя свойства, когда дело касается скорости.

Я хочу сказать, прежде чем вы начнете оптимизировать, используйте профилировщик. (Конечно, если вы не можете хорошо изменить сетку, вы также не сможете ее оптимизировать)

0
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: