C# longueur variable args, ce qui est mieux et pourquoi: __arglist, array params, ou Dictionnaire<T,K>?

J'ai lu récemment le dépassement de capacité suivants post:
Les Fonctions cachées de C#

Une des caractéristiques relevé est l'arglist. Pourquoi serait-on choisir ce ou les solutions de rechange comme un moyen d'utiliser une variable longueur de la liste d'arguments pour une méthode? Notez également que je n'aurais probablement pas utiliser ce genre de construction dans mon code, à moins qu'un cas de coin justifié de le faire. C'est plus une question de sémantique que s'il est même pratique ou prudent de même utiliser de longueur variable d'arguments. Donc, personne ne sait ce qui est mieux et pourquoi?

 [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);
 }
La seule de par sa conception objet d' __arglist est de sorte que vous pouvez faire en toute sécurité l'interopérabilité des appels vers et à partir des bibliothèques écrites en C++ qui utilisent de style C var args. Ne l'utilisez pas pour rien, mais que.
Si vous voulez pinvoke wsprintf fonction tu dois utiliser __arglist.

OriginalL'auteur mkelley33 | 2009-05-26