using System;
namespace 委托
{
delegate void StringProccess(string name);
delegate int IntProccess(int i);
class Program
{
static void Main(string[] args)
{
//实例委托
DelegateA objDelegateA = new DelegateA();
objDelegateA.StringValue("DelegateAname");
//可以直接简化为StringProccess objStringProccess1 =objDelegateA.StringValue;
//但是绝对不可以用 var objStringProccess1=objDelegateA.StringValue;
StringProccess objStringProccess1 = new StringProccess(objDelegateA.StringValue);
objStringProccess1("DelegateAnameStringProccess");
Console.WriteLine("Method:" + objStringProccess1.Method);
//静态委托
StringProccess objStringProccess2 = new StringProccess(DelegateB.StringValue);
objStringProccess2("DelegateB");
Console.WriteLine("Target:" + objStringProccess1.Target);
//多播委托 (需要显示转换且委托必须具有相同的类型)
var stringproccessCombine = (StringProccess) Delegate.Combine(objStringProccess1, objStringProccess2);
stringproccessCombine("stringproccessCombine");
//多播委托用+ - 其实他也就是调用的Delegate.Combine 或者Remove方法
StringProccess del = objStringProccess1 + objStringProccess2;
del("StringProccess多播委托用 +");
del -= objStringProccess1;
del("StringProccess多播委托用 -");
//action委托是一中没有返回值的委托的封装
//public delegate void Action();
//返回值是void(写法一)
Action voidAction1 = objDelegateA.VoidMethed;
voidAction1();
//返回值是void(写法二)
Action voidActon2 = () =>
{
objDelegateA.VoidMethed();
};
voidActon2();
//返回匿名委托 (写法一)
//public delegate void Action<in T>(T obj);
Action<string> actionString1 = delegate(string name)
{
objDelegateA.StringValue(name);
};
actionString1("返回匿名委托actionString1");
//返回匿名委托 (写法二)
Action<string> actionString2 = (string name) =>
{
objDelegateA.StringValue(name);
};
actionString2("返回匿名委托actionString2");
//返回匿名委托 (写法三)
Action<string> actionString3 = name =>
{
objDelegateA.StringValue(name);
};
actionString3("返回匿名委托actionString2");
actionString3.Invoke("返回匿名委托actionString2 Invoke");
//AsyncCallback异步回调委托
//public delegate void AsyncCallback(IAsyncResult ar);
//其返回值也是void 但是参数必须是IAsyncResult
AsyncCallback asyncCallback = new AsyncCallback(objDelegateA.ProcessDnsInformation);
IAsyncResult asyncResult = actionString3.BeginInvoke("返回匿名委托actionString2 BeginInvoke", asyncCallback, null);
actionString3.EndInvoke(asyncResult);
//func<T,ResultT>委托有返回值的委托
//public delegate TResult Func<in T, out TResult>(T arg);
//写法一
Func<int, int> funcReulst1 = delegate(int i)
{
return objDelegateA.IntValue(i);
};
Console.WriteLine(funcReulst1(1234));
//写发二
Func<int, int> funcReulst2 = i=> objDelegateA.IntValue(i);
Console.WriteLine(funcReulst2(1234));
//其他属性和action delegate都差不多
Console.ReadKey();
}
}
class DelegateA
{
public void VoidMethed()
{
Console.WriteLine("VoidMethed");
}
public void StringValue(string name)
{
Console.WriteLine(name);
}
public int IntValue(int i)
{
return i;
}
public void ProcessDnsInformation(IAsyncResult ar)
{
Console.WriteLine("异步委托调用IAsyncResult");
}
}
class DelegateB
{
public static void StringValue(string name)
{
Console.WriteLine(name);
}
}
}