usos práticos da TypedReference
-
19-09-2019 - |
Pergunta
Existem quaisquer usos práticos do TypedReference
struct que você realmente usar em código real?
Editar : Os usos do .NET Framework-los em sobrecargas de Console.WriteLine
e String.Concat
que construir uma matriz de um parâmetro __arglist
e passá-lo para a sobrecarga params
normais. Por que existem essas sobrecargas?
Solução
Existem quaisquer usos práticos do struct TypedReference que você realmente usar em código real?
Sim. Eu usá-los se eu precisava de interoperabilidade com métodos variádicos de estilo C.
Por que existem essas sobrecargas?
Eles existem para interoperabilidade com chamadores que gostam de usar métodos variádicos de estilo C.
Outras dicas
Esta parece ser uma questão muito antiga, mas eu gostaria de acrescentar mais um caso de uso: quando você tem um struct e pretende definir sua variável através da reflexão, você sempre operar com o valor em caixa e nunca mudança o original. Esta é inútil:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = typeof(TestFields).GetField("MaxValue");
info.SetValue(fields, 4096);
// result: fields.MaxValue is still 1234!!
Isto pode ser remediado com o boxe implícita, mas então você solta a segurança de tipos. Em vez disso, você pode corrigir isso com um 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!!