Здравствуйте, CodingUnit, Вы писали:
CU>Спасибо за ответ, все таки кажется редкой такая ситуация когда могут быть загружены одинаковые типы из разных сборок, это скорее исключительная ситуация, а чаще приходится сравнивать встроенные типы, которые соответствуют одной версии типа в библиотечной сборке, может вы подскажите или дадите ссылку когда такая ситуация может встречаться, потому что на данный момент в C# только так и поступаю, сначала пробовал именно тот вариант с сравнением имени,
Достаточно загрузить две разных версии одной библиотеки. С системными типами это сделать сложнее, а вот с типами из сборок третих лиц, без проблем. Причем загрузка может быть опосредованной (грузишь одну сборку, а она тянет вторую копию другой).
CU>но это сказывается на производительности, ведь сравнение двух строк в реальном времени не такая простая операция как сравнение двух ссылок, при том что по определению CLR ссылки Type оригинальны для каждого типа и равны для одинаковых типов. Поэтому все же вариант с when кажется более приемлемым, но прошу разъяснить ситуацию в потребности избегать сравнения ссылок через сравнение имен.
Строки сравниваются по хэш-значению. Это не так уж и медленно. Кроме того строки можно интернировать (string.Intern(), string.IsInterned()). Тогда можно будет сравнивать их адреса.
К слову, операция typeof(тип) не бесплатна. Я не проводил эксперименты, но не удивлюсь, если она окажется сопоставима по временным затратам со сравнением строк.
Если же нужна производительность любой ценой, то разумно создать собственный кэш (отображение типов на некие целые числа). Тогда сравнение типов превратится в сравнение целых.
Если сравниваются системные типы, то для них можно использовать
TypeCodeАвтор: desco
Дата: 29.01.10
(как правильно заметил
desco).
Но если говорить о решение на основе немреле, то конечно лучше вообще избавиться от рантайм-сравнений. Макросы — это как раз то что нужно для решения подобных задач.
Так что лучше опиши задачу (исходную, а не текущее решение), а мы подскажем как ее лучше всего решить на Немерле.