C#的Delegate的小心得
usingSystem;
namespaceDelegate1
{
publicclassMyClass
{
publicintInstanceMethod(inta,intb)
{
Console.WriteLine("CallInstanceMethod");
Console.WriteLine("Firstparametreis{0},secondparametreis{1}",a,b);
return0;
}
staticpublicintStaticMethod()
{
Console.WriteLine("CallStaticMethod");
return0;
}
}
classClass1
{
//聲明的代表元要與將代表的方法的參數序列保持一致
privatedelegateintMyDelegate();
privatedelegateintMeDelegatePara(inta,intb);
[STAThread]
staticvoidMain(string[]args)
{
MyClassp=newMyClass();
//將代表元指向靜態方法StaticMethod
MyDelegateD=newMyDelegate(MyClass.StaticMethod);
D();
//將代表元指向帶參數的非靜態方法InstanceMethod
MeDelegateParad=newMeDelegatePara(p.InstanceMethod);
d(1,2);
}
}
}例1的缺點在於每次使用代表元時都要進行實例化,如果能從類中獲取代表元就方便了很多,解決方法是將代表元的聲明放入到高一級的名字空間中,或者將代表元封裝到一個類中,然後在相關類中以屬性的形式綁定靜態代表.我推薦使用類封裝的方式,下面是改進後的類結構.
usingSystem;
namespaceDelegate1
{
publicclassCDelegate
{
//聲明的代表元與將代表的方法的參數的序列要保持一致
publicdelegateintMyDelegate();
publicdelegateintMeDelegatePara(inta,intb);
}
publicclassMyClass
{
publicintInstanceMethod(inta,intb)
{
Console.WriteLine("CallInstanceMethod");
Console.WriteLine("Firstparametreis{0},secondparametreis{1}",a,b);
return0;
}
staticpublicintStaticMethod()
{
Console.WriteLine("CallStaticMethod");
return0;
}
publicstaticCDelegate.MyDelegateMyDelegate1
{
get
{
returnnewCDelegate.MyDelegate(StaticMethod);
}
}
publicCDelegate.MeDelegateParaMyDelegate2
{
get
{
returnnewCDelegate.MeDelegatePara(InstanceMethod);
}
}
}
classClass1
{
[STAThread]
staticvoidMain(string[]args)
{
MyClassp=newMyClass();
//將代表元指向靜態方法StaticMethod
CDelegate.MyDelegateD=MyClass.MyDelegate1;
D();
//將代表元指向帶參數的非靜態方法InstanceMethod
CDelegate.MeDelegateParad=p.MyDelegate2;
d(1,2);
}
}
}
推薦閱讀:
※裝修心得不看後悔 家庭裝修50條注意事項
※玄空飛星心得九大要訣B--李居明
※教學心得體會
※十善心得分享之五十四
TAG:心得 |