我正在打电话:
myResult = MakeMyCall(inputParams, out messages);
但我实际上并不关心这些消息。如果它是输入参数,我不在乎,我只是传入一个null。如果那是回报,我不在乎,我就不理会它。
有没有办法用out做类似的事情,还是我需要声明一个我将忽略的变量?
我正在打电话:
myResult = MakeMyCall(inputParams, out messages);
但我实际上并不关心这些消息。如果它是输入参数,我不在乎,我只是传入一个null。如果那是回报,我不在乎,我就不理会它。
有没有办法用out做类似的事情,还是我需要声明一个我将忽略的变量?
Answers:
从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};
在函数调用后添加行,而不会出现任何编译错误。
如果类的messages
工具IDisposable
,你不应该忽略它。考虑类似以下方法的方法(由于我有一段时间没有编写C#,因此在语法上可能不正确):
using (FooClass messages) {
myResult = MakeMyCall(inputParams, messages);
}
一旦离开using
砖块,messages
将被自动处置。
using
语句的开头获取变量的副本。因此,在块内更改该变量的值不会更改要处置的对象。
out messages
。
您必须为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.
在这种情况下,我为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);