如何定义一个可以接受不同参数序列的方法

本文关键字:参数 方法 定义 何定义 一个 | 更新日期: 2023-09-27 18:28:39

在C#、Python和/或VB.NET中,如何编写一个可以接受不同参数序列的类的方法?作为一种指示,在Visual Studio中按shift+shift+space时,可以访问参数序列的多选。

如何定义一个可以接受不同参数序列的方法

您必须创建多个具有相同名称和不同参数的方法(称为重载方法):

public int myMethod(String someString){
    //code
}
public int myMethod(int someInt){
    //code
}

在Python中,可以使用*args(用于位置参数)和**kwargs(用于命名参数)来捕获传递给方法的所有参数:

class Example:
    def method(self, *args, **kwargs):
        print args, kwargs
    def method2(self, arg0, arg1, arg2, **kwargs):
        print arg0, arg1, arg2, kwargs

这给出:

>>> e = Example()
>>> e.method(1, 2, 3, key='value')
(1, 2, 3) {'key': 'value'}
>>> e.method(1, 2, key1='value1', key2='value2')
(1, 2) {'key2': 'value2', 'key1': 'value1'}

Example中,方法method2具有至少三个参数(arg0arg1arg2)和零个或多个关键字参数(**kwargs)。这意味着您可以按如下方式调用method2

>>> e = Example()
>>> e.method2(1, 2, 3)
1 2 3 {}
>>> e.method2(1, 2, 3, key='value')
1 2 3 {'key': 'value'}

我试图在方法重载和变量参数数方面更加明确。您可以在相同的interfaceclassstruct中使用相同名称的不同方法,只要它们在C#和VB.C#中具有不同数量的参数或不同类型的参数(或两者都有)。示例:

public int Foo(string s)       // OK, first method
public int Foo(double d)       // OK, different type
public void Foo(double x)      // Error, same parameter type, return
                               // type and parameter name do not matter.
public int Foo(string s, DateTime d)   // OK, diffent number of parameters.

此外,最后一个参数可以是一个数组,它表示不同数量的参数。它必须与params关键字(C#)或ParamArray关键字(VB)一起引入。

C#

public int Foo(string s, params int[] n)

VB

Function Foo(ByVal s As String, ByVal ParamArray n As Integer()) As Integer 

你可以这样称呼它,C#

int i = Foo("Hello");   
int i = Foo("Hello", 5);   
int i = Foo("Hello", 5, 7);   
int i = Foo("Hello", 5, 7, 13);   
int i = Foo("Hello", new int[] { 2, 4, 6 });   

您还可以使用.Net 4的命名和可选参数功能:http://msdn.microsoft.com/en-us/library/dd264739.aspx?ppud=4

public void myMethod(object requiredParam, object optionalParam = null, 
                     int optionalInt= 0)
{
}

在这个方法中,您必须拥有的唯一参数是第一个。如果未提供其他两个值,则它们将默认为提供的值。

如果参数的类型不同,则可以重载方法

或者,您可以只传入一个指示参数序列的值,并在方法中设置相应的逻辑来处理它。