创建具有动态参数数的方法
本文关键字:数数 方法 参数 动态 创建 | 更新日期: 2023-09-27 18:01:53
是否可以在c#中创建动态参数数的方法?
例如Public void sum(dynamic arguments//like JavaScript)
{
//loop at run-time on arguments and sum
}
我可以使用动态对象吗?
使用params
关键字实现可变数量的参数
params关键字允许您指定一个方法参数,该参数接受参数的可变数量。您可以发送以逗号分隔的列表参数声明中指定的类型的参数,或指定类型的参数数组。你也可以发送no参数。
例如:public void Sum( params int[] args ){ }
我可以使用动态对象吗?
是的,但可能不是你想的那样。
// example 1 - single parameter of type dynamic
private static void Sum( dynamic args ) { }
// will not compile; Sum() expects a single parameter whose type is not
// known until runtime
Sum( 1, 2, 3, 4, 5 );
// example 2 - variable number of dynamically typed arguments
private static void Sum( params dynamic[] args ) { }
// will compile
Sum( 1, 2, 3, 4, 5 );
你可以有这样一个方法:
public static dynamic Sum( params dynamic[] args ) {
dynamic sum = 0;
foreach( var arg in args ){
sum += arg;
}
return sum;
}
设为:Sum( 1, 2, 3, 4.5, 5 )
。DLR足够聪明,可以从参数中推断出正确的类型,返回值将是System.Double
。然而(至少在Sum()
方法的情况下),放弃对类型规范的显式控制并失去类型安全似乎是一个坏主意。
我假设你有理由不使用Enumerable.Sum()
是的,你可以看看这里
http://msdn.microsoft.com/library/w5zay9db (v = vs.80) . aspx
(params
关键词)
也许一个示例单元测试稍微说明了一些问题:
[Test]
public void SumDynamics()
{
// note that we can specify as many ints as we like
Assert.AreEqual(8, Sum(3, 5)); // test passes
Assert.AreEqual(4, Sum(1, 1 , 1, 1)); // test passes
Assert.AreEqual(3, Sum(3)); // test passes
}
// Meaningless example but it's purpose is only to show that you can use dynamic
// as a parameter, and that you also can combine it with the params type.
public static dynamic Sum(params dynamic[] ints)
{
return ints.Sum(i => i);
}
要注意,当使用动态,你告诉你的编译器后退,所以你会得到你的异常在运行时。
[Test, ExpectedException(typeof(RuntimeBinderException))]
public void AssignDynamicIntAndStoreAsString()
{
dynamic i = 5;
string astring = i; // this will compile, but will throw a runtime exception
}
阅读更多关于动力学的内容。
阅读更多关于参数