当前位置:  开发笔记 > 编程语言 > 正文

如何明确地抛弃一个参数?

如何解决《如何明确地抛弃一个参数?》经验,为你挑选了4个好方法。

我正在打电话:

myResult = MakeMyCall(inputParams, out messages);

但我实际上并不关心这些消息.如果它是一个输入参数我不关心我只是传入一个null.如果是回归我不关心我只是把它关掉.

有没有办法用out做类似的事情,或者我是否需要声明一个我将忽略的变量?



1> Nolonar..:

从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`来获取语法,而下划线似乎是一个奇怪的选择.

2> Jon Skeet..:

您必须声明一个您将忽略的变量.最常见的情况是TryParse(或TryWhatever)模式,当它用于测试用户输入的有效性时(例如,它可以解析为数字吗?)而不关心实际的解析值.

你在问题中使用了"dispose"这个词,我怀疑它是不幸的 - 但是如果out参数是一个实现IDisposable的类型,你当然应该调用Dispose,除非方法文档明确指出接收值不会给出所有权.我不记得曾经看过一个带有一次性out参数的方法,所以我希望这只是一个不吉利的选择.



3> Andrew Hare..:

不幸的是,您需要传递一些东西,因为需要设置它的方法.所以你不能发送,null因为需要设置它的方法会爆炸.

隐藏丑陋的一种方法是将方法包装在另一个out为您执行参数的方法中:

String Other_MakeMyCall(String inputParams)
{
    String messages;

    return MakeMyCall(inputParams, out messages);
}

然后你可以打电话Other_MakeMyCall而不必摆弄out你不需要的参数.



4> bmm6o..:

如果原始函数声明如下:

class C
{
    public Result MakeMyCall(Object arg, out List messages);
}

您可以声明这样的扩展方法:

static class CExtension
{
    public static Result MakeMyCall(this C obj, Object arg)
    {
        List unused;
        return obj.MakeMyCall(arg, out unused);
    }
}

扩展方法的行为类似于使out参数可选的重载.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有