有什么办法只是不打扰在C#中的输出参数?

我正在打电话:

myResult = MakeMyCall(inputParams, out messages); 

但我实际上并不关心这些信息。 如果这是一个input参数,我不关心我只是传入一个null。 如果这是回报,我不在乎,我只是离开它。

有没有办法做出类似的事情,还是我需要声明一个variables,然后我会忽略?

从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/

你必须声明一个你将会忽略的variables。 当TryParse(或TryWhatever)模式用于testing用户input的有效性(例如,它可以被parsing为数字吗?)而不关心实际的parsing值时,这是最常见的情况。

你在问题中使用了“dispose”这个词,我怀疑这个词是不幸的 – 但是如果out参数是一个实现了IDisposable的types的话,你应该调用Dispose,除非方法文档明确指出接收的值没有赋值所有权。 我不记得曾经看到一个一次性out参数的方法,所以我希望这只是一个不幸的话的select。

不幸的是,你需要传递的东西,因为方法是需要设置它。 所以你不能发送null因为需要设置它的方法会被炸毁。

一种隐瞒丑陋的方法是将方法封装在另一个方法中,这个方法可以为你提供out参数。

 String Other_MakeMyCall(String inputParams) { String messages; return MakeMyCall(inputParams, out messages); } 

然后,您可以调用Other_MakeMyCall而不必调Other_MakeMyCall不需要的参数。

如果原始函数是这样声明的:

 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编译器通过创build一个虚拟variables来完成此操作。 C#可以做到这一点,如果你能说服微软它的一个好主意。

您必须为outparameter passing一个variables。 传递之前,您不必初始化variables:

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

通常情况下,您可以在调用之后忽略“消息” – 除非由于某种原因(如使用有限的系统资源)“消息”需要处理,在这种情况下,应该调用Dispose():

 messages.Dispose(); 

如果它可能使用大量的内存,并且它将在一段时间内保持在范围内,那么它应该被设置为null,如果它是一个引用types,或者如果它是一个值types,则应该被设置为一个新的默认实例,收集器可以回收内存:

 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); 

如果messages类实现了IDisposable ,则不应该忽略它。 考虑一下类似下面的方法(可能在语法上不正确,因为我没有编写C#):

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

一旦在using块之外, messages将自动处理。