C#:paramsキーワードに対リスト
-
22-09-2019 - |
質問
そpro/連結実績にparamsキーワードに対リストを入力としてあり、c#と機能しているのでしょうか。
主にどの 性能 への配慮およびその他の貿易をロードします。
解決
シンタックスシュガーは、C#コンパイラによって処理されたキーワードのparams。ボンネットの下に、それは実際に回しています。
void Foo(params object[] a) { ... }
Foo(1,2,"THREE");
タグの中へ
void Foo(object[] a) { ... }
Foo(new object[] { 1, 2, "THREE" })
からのパフォーマンスは、それがリストの<>を作成するよりも、配列を作成するために少し高速ですので、あなたが求めているような視点はおよそ、のparamsコールが速く、単純です。上記の二つの断片の間には、性能差はありません。
他のヒント
個人としての利用 params
書き込み機能の入力による 他のプログラマー (例えば String.Format
) IEnumerable
書き込み機能一覧データの提供 コンピュータ (例えば File.Write
).
の性能に影響を考慮する必要はありません。Ipodを再生し、お気に入りの性能の些細なことのようにこのは 正確に 何Donald Knuthについて話していたので有名な"早期の最適化の根源悪"にお見積させていただきます。
とはいえ、askerう晴れでもう好きにしちゃってください:
結果は10万回:
params took 308 ms
list took 879 ms
これらの結果になることがわかります。params配列は二度とします。に簡単にできることを話そう 一千万倍 下二段にいることを完全に無駄によってお時間を気にします。使用自分に合ったコード最高です。
このコードを試して(作成、実行リリースモードを使用VS2008)
class Program
{
const int COUNT = 10000000;
static IEnumerable<string> m_value = null;
static void ParamsMethod(params string[] args)
{ m_value = args; } // do something with it to stop the compiler just optimizing this method away
static void ListMethod(List<string> args)
{ m_value = args; } // do SOMETHING with it to stop the compiler just optimizing this method away
static void Main(string[] args)
{
var s = new Stopwatch();
s.Start();
for (int i = 0; i < COUNT; ++i)
ParamsMethod("a", "b", "c");
Console.WriteLine("params took {0} ms", s.ElapsedMilliseconds);
s.Reset();
s.Start();
for (int i = 0; i < COUNT; ++i)
ListMethod(new List<string> { "a", "b", "c" });
Console.WriteLine("list took {0} ms", s.ElapsedMilliseconds);
}
}
まあ、params
はよりよい構文が可能になりますが、別のクラスがインタフェースを実装する可能性があるため(あなたの平均IList<>
を想定)のリストは、より柔軟です。あなたが(例えばList<>
など)のインターフェイスでサポートされていないリストで特定の操作を実行する必要がある場合ToArray()
を渡すことだけ理にかなっています。
あなたが動的に次のようにコンパイルエラーを気にすることなく、関数の引数の変数番号を渡すことができますキーワードのparamsます:
public string PrefixFormatString(string p, string s, params object[] par)
{
return p + string.Format(s, par);
}
...
PrefixFormatString("COM", "Output Error #{0} - Error = {1}", errNum, errStr);
あなたはリストを渡すと、、あなたはそれを渡すことができます前に、リストを構築する必要があります:
public string PrefixFormatString(string p, string s, List<object> par)
{
return p + string.Format(s, par.ToArray());
}
...
List<object> l = new List<object>(new object[] { errNum, errStr });
PrefixFormatString("COM", "Output Error #{0} - Error = {1}", l);
は、それが機能が期待されるデータの種類の意味を非表示にする傾向がある。
これは単純な配列変数を渡すと非常に類似していることを注。唯一の違いは、コンパイラが、私は100%わからないんだけど、私は技術的な違いは、単に構文糖であると思います...あなたのための配列にパラメータを修正することである - のいずれかの場合にはあなたが本当にの配列を渡しているものは何でもパラメータを入力されます。
さて、のparamsキーワードを使用すると、次のようにメソッドに引数を入力することができます:
MethodName(1, 2, 3, 4);
しかし、リストで、あなたはこのようにそれを行うだろう
MethodName(new List<int> {1, 2, 3, 4});
構文がもう少し明確前者に後者よりもすることができます。あなただけで合格する一つのパラメータを持っている場合に便利です。
// params
MethodName(1);
// List
MethodName(new List<int> {1});
params
パラメータの可変数を取る関数の言語構造です。即ちprintf(char* fmt, ...)
- それはC省略記号指定子に類似しています。言語は、それが読みコードが容易になります場合は特に、同様にそれを使用する場合があり、この種の操作をサポートしています。
個人的に、私はのparamsをスキップします。私は一度か二度、それにかましてきました。どうやって?私に説明してみましょう。
あなたはこの署名を使用してパブリックメソッドを記述します:
public static void LogInUser(string username, string password, params string[] options)
あなたはそのが行われ、それは動作しますが、それをテスト...と別のアセンブリ/アプリケーションは、あなたの関数を呼び出すされます。
さて、一ヶ月後、ユーザーの役割を追加するためにあなたの署名を変更したい:
public static void LogInUser(string username, string password, string role, params string[] options)
ああどのように物事があなたのメソッドを呼び出して何のために変更されています。
LogInUser("z@z.com", "zz", "Admin", "rememberMe", "800x600");
params
とそれが実行時に渡されたリストに依存しながら、私が見ることができることは両者の主な違いは、パラメータの数がメソッドに渡されたことであるが、List<T>
を使用してコンパイル時に設定されている。
かどうかは、あなたの方法は、コンパイル時に呼び出される必要があることに引数の数を固定することは賛否がデザインし、それのための意思に完全に依存しています。どちらかあなたが達成するために望んでいるものに応じて利益することができます。
Params
は、読みやすさを前面に役立ちます、そしてあなたがC#でに取得するつもりだというオプションのパラメータに近いようです。私は、任意の時点でのパラメータの数は不明を消費するために必要な場合、私は個人的にList<T>
実装を使用することになります。
編集:ちょうどパフォーマンスの問題について、あなたの編集を見つけました。 List<T>
が原因それらをコード化するために有することにその上に正気キャップを持っているのに対し、あなたは潜在的に、params
を使用して「パラメータ」の多数を期待できる場合がそのトピックに私は、わからないんです。
あなたのメソッドを呼び出すのプログラマののパフォーマンスは、時にはキーワードのparamsのご使用状況によって改善することができます。
(プログラマは、なぜあなたは、パフォーマンスの他の並べ替えを考えている、そんなに多く、次にコンピュータの費用がかかることを考える。)