题
我进行呼叫时:
myResult = MakeMyCall(inputParams, out messages);
但我并不真正关心的消息。如果是输入参数我不关心我只是传递一个空。如果它是回报,我不关心我只是把它关闭。
有没有办法做一个出类似的东西,或者我需要声明一个变量,那么我就要忽略?
解决方案
用C#7.0开始,它能够避免predeclaring出参数以及忽略它们。
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/
其他提示
您必须声明变量,然后你会忽略。这是最常见的与所述的TryParse(或TryWhatever)图案,当其用于无需关心实际解析的值来测试用户输入的有效性(例如,可以将其解析为多少?)的情况。
您用了“处置”的问题,我怀疑只是不幸 - 但如果从参数是实现IDisposable的类型,你当然应该调用Dispose,除非方法的文档明确规定,获得的价值没有按“T赋予所有权。我不记得曾经看到有虽然是一次性out
参数的方法,所以我希望这是的话只是一个不幸的选择。
不幸的是你需要,因为设置需要它的方法传递的东西。所以,因为该方法,被要求设置它,你不能发送null
,将炸毁。
一种方法来隐藏丑陋将包裹方法中,做了out
参数为你喜欢这样的另一种方法:
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);
}
}
扩展方法将像的过载,使输出参数是可选的。
Visual Basic编译器通过创建一个虚拟变量执行此操作。 C#可以做到这一点,如果你能说服微软它是一个不错的主意。
如果该类messages
的实现IDisposable
,你不应该忽略它。考虑像下面的方法(可以不是语法正确的,因为我没有在一段时间书面C#):
using (FooClass messages) {
myResult = MakeMyCall(inputParams, messages);
}
一旦using
块之外,messages
将被自动地设置。
您必须传递变量的输出参数。你不必传递之前,将初始化变量:
MyMessagesType messages;
myResult = MakeMyCall(inputParams, out messages);
通常,可以忽略“消息”该呼叫后 - 除非'消息的需要设置某种原因,如使用的有限的系统资源,在这种情况下,应该调用Dispose():
messages.Dispose();
如果它可能会使用的内存显著量,它是要保持在范围内的一段时间,它可能应该设置为空,如果它是引用类型或一个新的默认实例,如果它是值类型,所以垃圾收集器可以回收内存:
messages = null; // Allow GC to reclaim memory for reference type.
messages = new MyMessageType(); // Allow GC to reclaim memory for value type.
在这种情况下我为ConcurrentDictionary具有没有删除或移除方法制造的通用扩展方法。
//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);