Action<T>和Func<T>泛型委托
2012-08-20 15:03
295 查看
1.泛型Action<T>委托表示引用一个void返回类型的方法。因为这个委托类存在不同的变体,所以可
以传递至多16种不同的参数类型。没有泛型参数的Action类可调用没有参数的方法。Action<in T>
调用带一个参数的方法,Action<in T1,in T2>调用带两个参数的方法,Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8>调用带8个参数的方法。
2,Func<T>委托可以以类似的方式使用。Func<T>允许调用带返回类型的方法。与Action<T>类似,
Func<T>也定义了不同的变体,至多也可以传递16个参数类犁和一个返回类型。Func<out TResult>
委托类型可以调用带返回类型且无参数的方法,Func<in T,out TResult>调用带一个参数和一个返回参数的方法,
Func<in T1,in T2,in T3,in T4,out TResult>调用带4个参数和一个返回参数的方法。
下面是一个使用Func<in T,out TResult>的例子
-------类定义-----------------------
public class MathOperations
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
-------测试代码---------------------
private void button_测试委托2_Click(object sender, EventArgs e)
{
Func<double, double>[] operations =
//定义委托数组,带一个double参数和一个返回值为double类型参数的委托
{
MathOperations.MultiplyByTwo,
MathOperations.Square
};
for (int i = 0; i < operations.Length; i++)
//循环调用委托数组
{
Console.WriteLine("Use Operation {0}", i);
ProcessAndDisplayNumber(operations[i], 1.3);
ProcessAndDisplayNumber(operations[i], 2.6);
ProcessAndDisplayNumber(operations[i], 3.8);
Console.WriteLine();
}
}
private static void ProcessAndDisplayNumber(Func<double, double> action, double value)
{
double result = action(value);
Console.WriteLine(
"Value is {0},result of operation is {1}", value, result);
}
-------测试结果---------------------
![](http://my.csdn.net/uploads/201208/20/1345446958_2612.jpg)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二个例子
public partial class Form_测试Func泛型委托 : Form
{
public Form_测试Func泛型委托()
{
InitializeComponent();
}
private double Add(double x, double y)
{
return x + y;
}
private double Subtract(double x, double y)
{
return x - y;
}
private void btn测试Func泛型委托_Click(object sender, EventArgs e)
{
Func<double, double,double>[] operations =
{
Add,
Subtract
};
double result = 0;
for (int i = 0; i < operations.Length; i++)
{
result = operations[i](3.1, 4.5);
Console.WriteLine("{1} 结果 {0}", result,operations[i].Method.Name);
}
}
}
==输出结果==
以传递至多16种不同的参数类型。没有泛型参数的Action类可调用没有参数的方法。Action<in T>
调用带一个参数的方法,Action<in T1,in T2>调用带两个参数的方法,Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8>调用带8个参数的方法。
2,Func<T>委托可以以类似的方式使用。Func<T>允许调用带返回类型的方法。与Action<T>类似,
Func<T>也定义了不同的变体,至多也可以传递16个参数类犁和一个返回类型。Func<out TResult>
委托类型可以调用带返回类型且无参数的方法,Func<in T,out TResult>调用带一个参数和一个返回参数的方法,
Func<in T1,in T2,in T3,in T4,out TResult>调用带4个参数和一个返回参数的方法。
下面是一个使用Func<in T,out TResult>的例子
-------类定义-----------------------
public class MathOperations
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
-------测试代码---------------------
private void button_测试委托2_Click(object sender, EventArgs e)
{
Func<double, double>[] operations =
//定义委托数组,带一个double参数和一个返回值为double类型参数的委托
{
MathOperations.MultiplyByTwo,
MathOperations.Square
};
for (int i = 0; i < operations.Length; i++)
//循环调用委托数组
{
Console.WriteLine("Use Operation {0}", i);
ProcessAndDisplayNumber(operations[i], 1.3);
ProcessAndDisplayNumber(operations[i], 2.6);
ProcessAndDisplayNumber(operations[i], 3.8);
Console.WriteLine();
}
}
private static void ProcessAndDisplayNumber(Func<double, double> action, double value)
{
double result = action(value);
Console.WriteLine(
"Value is {0},result of operation is {1}", value, result);
}
-------测试结果---------------------
![](http://my.csdn.net/uploads/201208/20/1345446958_2612.jpg)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二个例子
public partial class Form_测试Func泛型委托 : Form
{
public Form_测试Func泛型委托()
{
InitializeComponent();
}
private double Add(double x, double y)
{
return x + y;
}
private double Subtract(double x, double y)
{
return x - y;
}
private void btn测试Func泛型委托_Click(object sender, EventArgs e)
{
Func<double, double,double>[] operations =
{
Add,
Subtract
};
double result = 0;
for (int i = 0; i < operations.Length; i++)
{
result = operations[i](3.1, 4.5);
Console.WriteLine("{1} 结果 {0}", result,operations[i].Method.Name);
}
}
}
==输出结果==
![](http://img.my.csdn.net/uploads/201210/24/1351067300_8843.jpg)
相关文章推荐
- Action<T>和Func<T>泛型委托
- c# action<> func<> 这2个委托怎么用和理解
- System.Func<>与System.Action<>
- C#中的Action<>和Func<>
- Action<T>和Func<T>的使用(转)
- Func<> Delegate和Action<> Delegate
- C#中的Action<>和Func<>
- System.Func<>与System.Action<> 简单对比
- C#基础:委托之Action<T>和Func<T>的用法(转)
- C#的委托 Action<>和Func<>
- Action<T>和Func<T>委托
- Action<T>和Func<T>委托
- Func<TResult>委托,Action 委托,Tuple 类
- 关于c#中的Func<>和Action<>
- C#中的Action<>和Func<>
- C#委托Action、Action<T>、Func<T>、Predicate<T>
- Delegate,Action<T>和Func<T>
- Func<T>,Action<T>,Predicate<T>使用小结
- c# action<> func<>
- C#委托Action、Action<T>、Func<T>、Predicate<T>