私は電話をかけています:
myResult = MakeMyCall(inputParams, out messages);
しかし、私は実際にはメッセージを気にしません。それが気にしない入力パラメーターである場合は、null を渡すだけです。それが私が気にしないリターンなら、私はそれをそのままにしておくだろう.
out で同様のことを行う方法はありますか、それとも無視する変数を宣言する必要がありますか?
無視する変数を宣言する必要があります。これは、実際に解析された値を気にせずにユーザー入力の有効性をテストするために使用される場合 (たとえば、数値として解析できるか)、TryParse (または TryWhatever) パターンの場合に最も一般的です。
質問で「破棄」という言葉を使用しましたが、これは残念だったと思いますが、out パラメーターが IDisposable を実装する型である場合は、値を受け取っても付与されないことがメソッドのドキュメントに明示的に記載されていない限り、必ず Dispose を呼び出す必要があります。所有。ただし、使い捨てパラメーターを持つメソッドを見た覚えがないout
ので、これが不運な言葉の選択であったことを願っています。
残念ながら、メソッドはそれを設定する必要があるため、何かを渡す必要があります。null
そのため、設定が必要なメソッドが爆発するため、送信できません。
out
醜さを隠すための1つのアプローチは、次のようにパラメーターを実行する別のメソッドでメソッドをラップすることです。
String Other_MakeMyCall(String inputParams)
{
String messages;
return MakeMyCall(inputParams, out messages);
}
その後、必要のないパラメーターOther_MakeMyCall
をいじる必要なく呼び出すことができます。out
元の関数が次のように宣言されている場合:
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パラメーターをオプションにするオーバーロードのように動作します。
Visual Basic コンパイラは、ダミー変数を作成することでこれを行います。マイクロソフトにその良い考えを納得させることができれば、C# はそれを行うことができます。
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.
のクラスがmessages
implementsの場合、IDisposable
それを無視すべきではありません。次のようなアプローチを検討してください (しばらく C# を書いていないため、構文的に正しくない可能性があります)。
using (FooClass messages) {
myResult = MakeMyCall(inputParams, messages);
}
using
ブロックの外に出ると、messages
自動的に破棄されます。