我进行呼叫时:

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top