我正在打电话:
myResult = MakeMyCall(inputParams, out messages);
Run Code Online (Sandbox Code Playgroud)
但我实际上并不关心这些消息.如果它是一个输入参数我不关心我只是传入一个null.如果是回归我不关心我只是把它关掉.
有没有办法用out做类似的事情,或者我是否需要声明一个我将忽略的变量?
Nol*_*nar 80
从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}");
}
Run Code Online (Sandbox Code Playgroud)
来源:https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/
Jon*_*eet 37
您必须声明一个您将忽略的变量.最常见的情况是TryParse(或TryWhatever)模式,当它用于测试用户输入的有效性时(例如,它可以解析为数字吗?)而不关心实际的解析值.
你在问题中使用了"dispose"这个词,我怀疑它是不幸的 - 但是如果out参数是一个实现IDisposable的类型,你当然应该调用Dispose,除非方法文档明确指出接收值不会给出所有权.我不记得曾经看过一个带有一次性out参数的方法,所以我希望这只是一个不吉利的选择.
And*_*are 36
不幸的是,您需要传递一些东西,因为需要设置它的方法.所以你不能发送,null因为需要设置它的方法会爆炸.
隐藏丑陋的一种方法是将方法包装在另一个out为您执行参数的方法中:
String Other_MakeMyCall(String inputParams)
{
String messages;
return MakeMyCall(inputParams, out messages);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以打电话Other_MakeMyCall而不必摆弄out你不需要的参数.
bmm*_*m6o 11
如果原始函数声明如下:
class C
{
public Result MakeMyCall(Object arg, out List<String> messages);
}
Run Code Online (Sandbox Code Playgroud)
您可以声明这样的扩展方法:
static class CExtension
{
public static Result MakeMyCall(this C obj, Object arg)
{
List<String> unused;
return obj.MakeMyCall(arg, out unused);
}
}
Run Code Online (Sandbox Code Playgroud)
扩展方法的行为类似于使out参数可选的重载.
| 归档时间: |
|
| 查看次数: |
27179 次 |
| 最近记录: |