1

規約に関して非常に単純な質問があります。メソッドが実際にいつC#のrefまたはoutパラメータを持つべきか?

これは、単に怠惰や悪いデザインではなく、良いOOPに従うことにどのように適合しますか?

一例として、MembershipCreateStatusをoutにしてMembershipUserを返すCreateUserメソッドを持つMembershipProviderクラス(.NET System.Web.Securityから)に出くわしました。

その理由は、基本的にメソッドから情報が必要だがメソッドから適切な情報が返されない場合があるためです。

ありがとう


3 답변


2

次のようなシステムを考えてください。

オブジェクトとある種のステータス(あるいはもっと多くのインスタンス)を返すメソッドがあります。戻り値には2つの選択肢があります。

  1. カプセル化するラッパーを作成します。bool(またはenum)状態と実際の結果
  2. これらn個のインスタンスを分離する

私は3つ以上のインスタンスを返さなければならない場合、ラッパーを好む。署名が状態と結果のみを処理する場合、私は好みますout/ref-スタイル。

にとってout/refスタイル私は例えばの署名を好む。TryParsebool TryParse(out T result)これはそれを使うときより自然な方法を与えるので。にとって:

int foo;
if (int.TryParse(someString, out foo)) {
   // do something with foo
}

一方

MyState state;
Foo fooInstance = FooCreator.Create(out state);
if (fooInstance != null)
* OR *
if (state == State.Success)

その自然ではないかもしれない


1

outパラメータの主な用途は、複数のものを返す必要がある場合です。

たとえば、TryParseは、多数の数値オブジェクトに対する静的メソッドで、成功した場合はtrue / falseとキャスト値の両方を返す必要があります。

複数の値を返す必要がある場合は、複数のプロパティを持つオブジェクト/構造を返すほうを好む人もいます。それだけの好みです。


1

C#によるとoutのドキュメント

outキーワードにより、引数は次のようになります。   参照渡しこれは似ている   refキーワードを除く   変数が   渡される前に初期化されます。

だから、使用しますrefメソッドに値を渡す必要があるとき、およびメソッドから値を受け取る必要があるときのパラメータ。を使うout情報の流れがメソッドから呼び出し元へのみである場合のパラメーター。ストーリーを完成させるために、情報をメソッドに渡しますが、メソッドから情報を受け取ることができない未評価のvalueパラメータがあります。

私はその考えを本当に買いませんoutそしてrefメソッドから複数の項目を返す必要がある場合にのみ使用されます。私はいつも使うのを好むout副作用のあるメソッドから値を返すため。

私にはそれがあなたの質問に対する答えです。メソッドに副作用がない場合、およびメソッドの名前が戻り値の意味と一致する名詞である場合は、関数から単一の値を関数の戻り値まで返します。そうでなければoutまたはrefパラメーター。

リンクされた質問


関連する質問

最近の質問