Recientemente he leído el siguiente mensaje de desbordamiento: Hidden Features of C#C# args de longitud variable, que es mejor y por qué: __arglist, params array o Dictionary <T,K>?
Una de las características señalado fue el arglist. ¿Por qué uno elegiría esta o las alternativas como un medio para usar una lista de argumentos de longitud variable para un método? Además, tenga en cuenta que probablemente no use este tipo de constructo en mi código a menos que un caso de esquina lo justifique. Esta es más una cuestión de semántica que si es incluso práctico o prudente usar incluso argumentos de longitud variable. Entonces, ¿alguien sabe cuál es mejor y por qué?
[Test]
public void CanHandleVariableLengthArgs()
{
TakeVariableLengthArgs(__arglist(new StringBuilder(), 12));
object[] arr = { new StringBuilder() };
TakeVariableLengthArgs2(arr);
TakeVariableLengthArgs3(
new Dictionary<string, object>
{ { "key", new StringBuilder() } });
}
public void TakeVariableLengthArgs(__arglist)
{
var args = new ArgIterator(__arglist);
var a = (StringBuilder)TypedReference.ToObject(args.GetNextArg());
a.Append(1);
}
public void TakeVariableLengthArgs2(params object[] args)
{
var a = (StringBuilder)args[0];
a.Append(1);
}
public void TakeVariableLengthArgs3(Dictionary<string, object> args)
{
var a = (StringBuilder)args["StringBuilder"];
a.Append(1);
}
El único mediante el diseño propósito de __arglist es por lo que se puede hacer de manera segura llamadas de interoperabilidad hacia y desde bibliotecas escritas en C++ que utilizan argumentos var estilo C. No lo uses para nada más que eso. –
Si desea [pinvoke] (http://www.pinvoke.net/default.aspx/user32/wsprintf.html) la [función wsprintf] (http://msdn.microsoft.com/en-us/library /windows/desktop/ms647550(v=vs.85).aspx) tienes que usar '__arglist'. – Bitterblue