.NET 是否有相当于 Python 中的 **kwargs 的功能?

问题描述 投票:0回答:2

我一直无法通过典型渠道找到这个问题的答案。

在Python中我可以有以下函数定义

def do_the_needful(**kwargs):
    # Kwargs is now a dictionary
    # i.e. do_the_needful(spam=42, snake='like eggs', spanish='inquisition')
    # would produce {'spam': 42, 'snake': 'like eggs', 'spanish': 'inquisition' }

我知道 .NET 有

ParamArray
,它会生成一系列未命名参数,类似于 Python 中的
*args
语法....NET 是否有
**kwargs
的等价物或类似的东西?

python .net equivalent
2个回答
4
投票

因此,不幸的是,没有办法在 C# 中模拟 Python

**kwargs
。在此过程中您总是会丢失参数名称(请参阅下面 @alelom 的评论)。

但是,您似乎要寻找的是可变参数函数。如果您想了解如何用各种编程语言实现它,最好是查看有关它的维基百科页面

因此,根据 Wikipedia,在 C# 和 VisualBasic 中实现可变参数函数是这样完成的:

其他语言,例如 C#、VB.net 和 Java 使用不同的 方法——它们只允许相同数量的参数 要传递给可变参数函数的(超级)类型。方法内部 它们只是被收集在一个数组中。

C# 示例

public static void PrintSpaced(params Object[] objects)
{
    foreach (Object o in objects)
        Console.Write(o + " "); 
}    
// Can be used to print: PrintSpaced(1, 2, "three");

VB.Net 示例

Public Shared Sub PrintSpaced(ParamArray objects As Object())
    For Each o As Object In objects
        Console.Write(o & " ")
    Next
End Sub

' 可用于打印:PrintSpaced(1, 2, "三")


0
投票

我想到的模式是创建一个方法,将名称值 arg 数组转换为 OrderedDictionary,然后在函数中接受 OrderedDictionary 参数作为参数。

Public Shared Function p2D(ParamArray args As Object()) As OrderedDictionary
    Dim kwargs As New OrderedDictionary
    For i As Integer = 0 To aNV.Length - 1 Step 2
        kwargs.Add(aNV(i), aNV(i + 1))
    Next
    Return kwargs
End Function

用途:

Public Shared Sub do_foo(kwargs as OrderedDictionary)
  ' parse kwargs and do stuff...  
End Sub

' Call do_foo 
do_foo(p2D("arg1", 1, "arg2", 2, "arg3", 3))

话虽如此,最好不要用 VB 编程,因为它是一种非常糟糕的语言,不适合做任何真正复杂的事情,而且它的 OOP 实现非常糟糕。如有疑问,请使用 C#。

© www.soinside.com 2019 - 2024. All rights reserved.