Подтвердить что ты не робот

Практическое использование TypedReference

Существуют ли какие-либо практические применения TypedReference struct, которые вы действительно используете в реальном коде?

EDIT. Структура .Net использует их в перегрузках Console.WriteLine и String.Concat, которые строят массив из параметра __arglist и передают его в нормальную params перегрузку. Почему эти перегрузки существуют?

4b9b3361

Ответ 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!!