Практическое использование TypedReference
Существуют ли какие-либо практические применения TypedReference
struct, которые вы действительно используете в реальном коде?
EDIT. Структура .Net использует их в перегрузках Console.WriteLine
и String.Concat
, которые строят массив из параметра __arglist
и передают его в нормальную params
перегрузку. Почему эти перегрузки существуют?
Ответы
Ответ 1
Существуют ли какие-либо практические применения структуры TypedReference, которые вы действительно используете в реальном коде?
Да. Я бы использовал их, если мне нужна интероперабельность с вариативными методами в стиле С.
Почему эти перегрузки существуют?
Они существуют для взаимодействия с абонентами, которые любят использовать вариативные методы в стиле C.
Ответ 2
Это, кажется, очень старый вопрос, но я хотел бы добавить еще один прецедент: когда у вас есть структура и вы хотите установить ее переменную через отражение, вы всегда будете работать с бокс-значением и никогда не будете меняться оригинал. Это бесполезно:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = typeof(TestFields).GetField("MaxValue");
info.SetValue(fields, 4096);
// result: fields.MaxValue is still 1234!!
Это может быть исправлено с подразумеваемым боксом, но тогда вы потеряете безопасность типа. Вместо этого вы можете исправить это с помощью TypedParameter
:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = fields.GetType().GetField("MaxValue");
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
// result: fields.MaxValue is now indeed 4096!!