我正在打电话:
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/
您必须声明一个您将忽略的变量.最常见的情况是TryParse(或TryWhatever)模式,当它用于测试用户输入的有效性时(例如,它可以解析为数字吗?)而不关心实际的解析值.
你在问题中使用了"dispose"这个词,我怀疑它是不幸的 - 但是如果out参数是一个实现IDisposable的类型,你当然应该调用Dispose,除非方法文档明确指出接收值不会给出所有权.我不记得曾经看过一个带有一次性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 Listmessages); }
您可以声明这样的扩展方法:
static class CExtension { public static Result MakeMyCall(this C obj, Object arg) { Listunused; return obj.MakeMyCall(arg, out unused); } }
扩展方法的行为类似于使out参数可选的重载.