2014-10-09 2 views
2

Не работают ли общие функции с нулевыми типами значений, или они не за кадром?Общие функции и типы значений

Например, у меня есть вспомогательные функции вроде этого:

public static TResult Return<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator, TResult failureValue) 
    where TInput : class 
{ 
    if (o == null) return failureValue; 
    return evaluator(o); 
} 

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

var log = person.Return(p => p.log, emptylog) 

Поэтому в зависимости от того, log является значение или ссылочный тип, нужна ли мне специальная версия Return() для обработки типов значений без бокса или это хорошо для всех случаев?

EDIT: Я любопытно, почему автор этой http://pastebin.com/vdS1uNu1 имеет специализации для класса -> структура, класс -> класса и т.д.

ответ

3

Нет, это не будет типов значений окна - но будет вызвать новую собственную реализацию метода, который будет создан (во время JIT) каждый раз, когда вы используете другой тип значения для TResult, тогда как все типы ссылок будут иметь один и тот же собственный код. Это очень редко проблема, хотя - это не похоже на накладные расходы. Это то, что «создать правильный собственный код на основе аргумента типа», который позволяет ему избегать бокса.

+0

Спасибо. Итак, почему этот код, например, предлагает специализированные реализации для типов value/ref? Не будет ли безусловный TResult работать? http://pastebin.com/vdS1uNu1 – user826840

+1

@ user826840: Нет, потому что некоторые из этих методов используют «TResult?» - это допустимо только в том случае, если TRESULT ограничен типом значения, отличным от NULL. –

+0

Но если я: 'публичный статический TResult MyTest (это TInput вход, Func лямбда) \t \t { \t \t \t возврата входного == NULL? default (TResult): lambda (ввод); \t \t} 'Кажется, что он работает при возврате типов значений ref, value или nullable. Так что в специальных реализациях нет смысла? Мне просто интересно, почему он беспокоился! Спасибо – user826840

Смежные вопросы