私は電話をかけています:
myResult = MakeMyCall(inputParams, out messages);
しかし、私は実際にはメッセージについて気にしません。それが入力パラメーターである場合、私は気にせず、nullを渡します。返品の場合は気にせず、そのままにしておきます。
outで同様のことを行う方法はありますか、それとも無視する変数を宣言する必要がありますか?
私は電話をかけています:
myResult = MakeMyCall(inputParams, out messages);
しかし、私は実際にはメッセージについて気にしません。それが入力パラメーターである場合、私は気にせず、nullを渡します。返品の場合は気にせず、そのままにしておきます。
outで同様のことを行う方法はありますか、それとも無視する変数を宣言する必要がありますか?
回答:
C#7.0以降では、事前宣言されたパラメーターを無視したり、無視したりすることを回避できます。
public void PrintCoordinates(Point p)
{
p.GetCoordinates(out int x, out int y);
WriteLine($"({x}, {y})");
}
public void PrintXCoordinate(Point p)
{
p.GetCoordinates(out int x, out _); // I only care about x
WriteLine($"{x}");
}
ソース:https : //blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/
*
ました_
。すみません、とても時間がかかりました。
out void
構文に使用するという考えにこだわっている必要があり、アンダースコアは奇妙な選択のようです。
_ = {a value};
コンパイルエラーなしで関数呼び出しの後に行を追加できるので、まだパラメーターを作成しているようです。
残念ながら、メソッドはそれを設定する必要があるため、何かを渡す必要があります。だからあなたは送ることができませんnull
ため、設定する必要があるメソッドが爆発するため、。
醜さを隠す1つの方法は、out
パラメーターを別の方法でラップすることです。
String Other_MakeMyCall(String inputParams)
{
String messages;
return MakeMyCall(inputParams, out messages);
}
その後、不要なパラメーターOther_MakeMyCall
をいじるout
必要なく呼び出すことができます。
無視する変数を宣言する必要があります。これは、実際に解析された値を気にせずにユーザー入力の有効性をテストするために使用される(たとえば、数値として解析できるか?)ときに使用される、TryParse(またはTryWhatever)パターンの最も一般的なケースです。
質問で「dispose」という単語を使用しましたが、これは残念なことだと思います。ただし、outパラメータがIDisposableを実装するタイプである場合は、メソッドのドキュメントで値の受信によって付与されないことが明示的に記述されていない限り、Disposeを呼び出す必要があります。所有。でも、使い捨ての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パラメータをオプションにするオーバーロードのように動作します。
のクラスがmessages
implements IDisposable
である場合は、無視しないでください。次のようなアプローチを考えてみてください(しばらくの間C#を記述していないため、構文的に正しくない可能性があります)。
using (FooClass messages) {
myResult = MakeMyCall(inputParams, messages);
}
using
ブロックの外側にmessages
なると、自動的に処分されます。
using
ステートメントの開始時に変数のコピーを取得します。したがって、ブロック内でその変数の値を変更しても、破棄されるオブジェクトは変わりません。
out messages
。
outパラメータには変数を渡す必要があります。渡す前に変数を初期化する必要はありません:
MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages);
通常、呼び出し後の 'messages'は無視できます-限られたシステムリソースの使用など、何らかの理由で '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.
この場合、ConcurrentDictionaryに対して、DeleteメソッドやRemoveメソッドを持たない汎用の拡張メソッドを作成しました。
//Remove item from list and ignore reference to removed item
public static void TryRemoveIgnore<K,T>(this ConcurrentDictionary<K,T> dictionary, K key)
{
T CompletelyIgnored;
dictionary.TryRemove(key, out CompletelyIgnored);
}
ConcurrentDictionaryのインスタンスから呼び出された場合:
ClientList.TryRemoveIgnore(client.ClientId);