3

最近、いくつかのコードをリファクタリングし、次のようなメソッドを持つ静的ユーティリティ クラスを作成しました。

const int x = 1;
public static string doWork(ref DataTable dt)
{
    decimal total = 0;
    foreach (DataRow row in dt.Select("COST_ID = " + x))
    {
        decimal annual = decimal.Parse(row["Cost"].ToString());
        total += decimal.Round(annual, 2);
    }
    return String.Format("{0:C}", total);
}

わかりやすくするために例を単純化しました...

これを行って、ASP.NET アプリケーションのコード ビハインドに doWork メソッドの呼び出しを配置すると、多くのユーザーがヒットするという悪影響を経験する可能性はありますか? パフォーマンスに関して、静的メソッドがどのように機能するかを知ることができる人はいますか? これはあらゆる種類のボトルネックになりますか?

編集:

はい、申し訳ありませんが、これはあまり良い例ではありません。次のように言ってみましょう。

const int x = 1;
public static string doWork(ref DataTable dt)
{
    foreach (DataRow row in dt.Select("COST_ID = " + x))
    {
        row["Cost"] = 0.0;
    }
}

A) Datatable は既に ref によって渡されているため、実際にはここで ref は必要ありません。B) 単一の静的メソッドへのすべての呼び出しを「ファネリング」しても、パフォーマンスはまったく影響を受けません。

4

7 に答える 7

8

ref によって参照型 (Datatable など) を渡す必要があるのは、クラスの新しいインスタンスにパラメーターを割り当てる予定がある場合だけです。この場合、Ref は必要ありません。値で渡します。

于 2011-06-14T14:56:29.243 に答える
5

このrefキーワードは、パフォーマンス目的では使用されません。別のスコープの変数が指すものを(簡単に言えば)変更したいときに使用されます。この場合の の使用refは無関係であり、将来的に問題が発生する可能性があります。

私の経験則refは次のとおりです。使用している場合は、おそらく使用すべきではありません。

最後に、パフォーマンスに関するご質問にお答えします。使用してrefも、現在のメソッドのパフォーマンス エンベロープは変わりません。


あなたの編集を読んだ後、あなたの2つの質問に対する直接の回答は次のとおりです。

  1. refこれは意図した使用法ではないため (そしてパフォーマンスのために使用されていないため)、使用すると混乱が生じるだけです。
  2. 正解です。ID 変数を使用してstaticメソッドを使用しconstても、シナリオで測定可能な方法でパフォーマンスが向上する可能性はほとんどありません。
于 2011-06-14T14:57:13.257 に答える
2

私の知る限り、静的メソッドはインスタンスのものより遅くはありません。それどころか、hidden を渡す必要がなくthis、おそらく仮想呼び出しを行う必要がないため、実際にはわずかに高速である可能性があります。

于 2011-06-14T14:55:23.227 に答える
1

このメソッドでは、「ref」キーワードは必要ありません。

于 2011-06-14T14:53:50.540 に答える
1

DataTableはすでに参照として渡されているため、refは必要ありません

于 2011-06-14T14:54:27.377 に答える
1

DataTableは、参照によって渡されるもののクラスインスタンスです。オブジェクトへの参照を変更しないため、「ref」キーワードは必要ありません。

于 2011-06-14T14:54:56.763 に答える
0

を使用しても、すべてのstatic方法でパフォーマンスが向上するわけではありませんref。詳細については、これrefを参照してください

于 2011-06-14T15:20:42.500 に答える