委托练习一

/*
委托
*/
using System;

namespace Frank
{
	public class Test
    {
		private delegate string GetAString();//定义委托
		private delegate double DoubleOp(double x);//定义第二个委托
        public static void Main(string[] args)
        {
			GetAString str = new GetAString(1.ToString);
			GetAString str2 = 1.ToString;//自动类型推断
			Console.WriteLine(str());//执行int类型里面的ToString方法输出1
			
			//完整写法
			str = new GetAString(new Test().Print);
			System.Console.WriteLine(str.Invoke());//执行委托上面的方法
			//简写模式
			str = new Test().Print;
			System.Console.WriteLine(str());
			
			//利用委托数组执行多个操作
			DoubleOp[] operations = new DoubleOp[]
			{
				new DoubleOp(Test2.MultiplyByTwo),//第一个操作全写模式
				Test2.Square//第二个操作,简写模式
			};
			for(int i = 0;i < operations.Length; i++)
			{
				System.Console.WriteLine("i = " +i);
				ProcessAndDisplayNumber(operations[i],2.0+i);
			}
			
			//使用Func委托
			Func<double,double>[] operations2 = new Func<double,double>[]
			{
				new Func<double,double>(Test2.MultiplyByTwo),
				Test2.Square
			};
			for(int i = 0;i < operations2.Length; i++)
			{
				System.Console.WriteLine("i = " +i);
				ProcessAndDisplayNumber(operations2[i],2.0+i);
			}
        }
		public string Print()
		{
			System.Console.WriteLine("委托执行方法!");
			return "sadas---";
		}
		static void ProcessAndDisplayNumber(DoubleOp action,double value)//带委托参数的普通方法
		{
			double result = action.Invoke(value);//或者action()
			System.Console.WriteLine("value {0} 计算后的值 {1}",value,result);
		}
		static void ProcessAndDisplayNumber(Func<double,double> action,double value)//重载一个带泛型委托参数的普通方法
		{
			double result = action(value);//执行委托
			Console.WriteLine(result);
		}
	}
	public class Test2//自定义类
	{
		public static double MultiplyByTwo(double value)
		{
			return value * 2;
		}
		public static double Square(double value)
		{
			return value * value;
		}
	}
}

  

posted on 2013-11-28 14:42  wp456  阅读(140)  评论(0)    收藏  举报

导航