114

私は電話をかけています:

myResult = MakeMyCall(inputParams, out messages);

しかし、私は実際にはメッセージを気にしません。それが気にしない入力パラメーターである場合は、null を渡すだけです。それが私が気にしないリターンなら、私はそれをそのままにしておくだろう.

out で同様のことを行う方法はありますか、それとも無視する変数を宣言する必要がありますか?

4

8 に答える 8

38

無視する変数を宣言する必要があります。これは、実際に解析された値を気にせずにユーザー入力の有効性をテストするために使用される場合 (たとえば、数値として解析できるか)、TryParse (または TryWhatever) パターンの場合に最も一般的です。

質問で「破棄」という言葉を使用しましたが、これは残念だったと思いますが、out パラメーターが IDisposable を実装する型である場合は、値を受け取っても付与されないことがメソッドのドキュメントに明示的に記載されていない限り、必ず Dispose を呼び出す必要があります。所有。ただし、使い捨てパラメーターを持つメソッドを見た覚えがないoutので、これが不運な言葉の選択であったことを願っています。

于 2009-01-20T17:20:46.833 に答える
37

残念ながら、メソッドはそれを設定する必要があるため、何かを渡す必要があります。nullそのため、設定が必要なメソッドが爆発するため、送信できません。

out醜さを隠すための1つのアプローチは、次のようにパラメーターを実行する別のメソッドでメソッドをラップすることです。

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

その後、必要のないパラメーターOther_MakeMyCallをいじる必要なく呼び出すことができます。out

于 2009-01-20T17:09:15.423 に答える
11

元の関数が次のように宣言されている場合:

class C
{
    public Result MakeMyCall(Object arg, out List<String> messages);
}

次のように拡張メソッドを宣言できます。

static class CExtension
{
    public static Result MakeMyCall(this C obj, Object arg)
    {
        List<String> unused;
        return obj.MakeMyCall(arg, out unused);
    }
}

拡張メソッドは、outパラメーターをオプションにするオーバーロードのように動作します。

于 2009-01-20T18:59:36.590 に答える
4

Visual Basic コンパイラは、ダミー変数を作成することでこれを行います。マイクロソフトにその良い考えを納得させることができれば、C# はそれを行うことができます。

于 2009-01-20T17:28:30.190 に答える
0

out パラメータには変数を渡す必要があります。変数を渡す前に変数を初期化する必要はありません。

MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages); 

通常、呼び出し後に「メッセージ」を無視することができます。ただし、限られたシステム リソースの使用など、何らかの理由で「メッセージ」を破棄する必要がある場合を除きます。その場合は、Dispose() を呼び出す必要があります。

messages.Dispose();

大量のメモリを使用する可能性があり、しばらくスコープ内に留まる場合は、参照型の場合は null に設定する必要があり、値型の場合は新しい既定のインスタンスに設定する必要があります。コレクタはメモリを再利用できます:

messages = null; // Allow GC to reclaim memory for reference type.

messages = new MyMessageType(); // Allow GC to reclaim memory for value type.
于 2009-01-20T17:28:04.417 に答える
0

のクラスがmessagesimplementsの場合、IDisposableそれを無視すべきではありません。次のようなアプローチを検討してください (しばらく C# を書いていないため、構文的に正しくない可能性があります)。

using (FooClass messages) {
    myResult = MakeMyCall(inputParams, messages);
}

usingブロックの外に出ると、messages自動的に破棄されます。

于 2009-01-20T17:12:06.430 に答える