网站建设翻译插件,安安互联怎么上传网站,小米商城网站建设,百事可乐运用了哪种网络营销方式1.委托 1.1什么是委托
委托委托 官网解释: 委托是安全封装方法的类型#xff0c;类似于 C 和 C 中的函数指针。 与 C 函数指针不同的是#xff0c;委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 个人理解:委托就是一个方法的模板。它可以接收…1.委托 1.1什么是委托
委托委托 官网解释: 委托是安全封装方法的类型类似于 C 和 C 中的函数指针。 与 C 函数指针不同的是委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 个人理解:委托就是一个方法的模板。它可以接收签名(签名一致就是方法的参数与返回值类型与其一致)与它一致的方法作为参数传递给它执行。 1.2 如何定义委托 使用关键字 delegate 声明委托
public delegate int GetNum(int a, int b); 除了使用delegate 定义 委托以外C#提供两个定义好的泛型委托 (Action 与 Func) (当然你也可以使用delegate自定义泛型委托)
这里先介绍两个C#定义的委托相信很多人都在使用不管你清不清楚什么是委托
Action:是无返回值的泛型委托。
下面action 表示无参无返回值的委托
private void WTBtn_Click(object sender, EventArgs e)
{Action action new Action(AA);//定义委托action();//使用方式1action.Invoke();//使用方式2
}private void AA()
{Console.WriteLine(我是传入的无参无返回值的委托方法);
}
下面action 表示有传入参数int,string无返回值的委托
private void WTBtn_Click(object sender, EventArgs e)
{Actionint,string action new Actionint, string(AA);action(1,);//使用方式1action.Invoke(1, );//使用方式2
}private void AA(int a,string b)
{Console.WriteLine(我是传入的有参无返回值的委托方法);
}
Func:是有返回值的泛型委托。Funcobject,string,int object,string为参数。int为返回值
下面action 表示有传入参数int返回值string的委托
private void WTBtn_Click(object sender, EventArgs e)
{Funcint,string action new Funcint, string(AA);//ab我是传入的有参无返回值的委托方法var a action(1);//使用方式1var b action.Invoke(1);//使用方式2
}private string AA(int a)
{Console.WriteLine(我是传入的有参无返回值的委托方法);return 我是传入的有参无返回值的委托方法;
} 运行结果如下图: 下面action 表示有无参数有返回值string的委托
private void WTBtn_Click(object sender, EventArgs e)
{Funcstring action new Funcstring(AA);//ab我是传入的有参无返回值的委托方法var a action();//使用方式1var b action.Invoke();//使用方式2
}private string AA()
{Console.WriteLine(我是传入的有参无返回值的委托方法);return 我是传入的有参无返回值的委托方法;
} C#自带的委托说完了下面说 delegate 自定义的委托
下面代码定义了一个委托和一个静态类的方法。委托的级别与类等同所以可以定义在命名空间里当然也能定义在类里。 /// summary/// 定义委托/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic delegate int GetNum(int a, int b);public static class WTModel{/// summary/// 加法/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic static int Add(int a,int b){Console.WriteLine(执行Add了方法);return a b;}/// summary/// 减法/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic static int Sub(int a, int b){Console.WriteLine(执行Sub了方法);return a - b;}/// summary/// 乘法/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic static int Multi(int a, int b){Console.WriteLine(执行Multi了方法);return a * b;}/// summary/// 除法/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic static int Division(int a, int b){Console.WriteLine(执行Division了方法);if (b 0){return 0;}return a / b;}}
定义的GetNum委托与C#自带的两个委托是同级的使用方式也是一页只不C#自带的是泛型的GetNum却是固定了两个参数为int类型且返回值是int类型的签名。故此能传入GetNum的方法的参数与返回值必须与GetNum保持一致。
使用方式:下面将上面Add方法传入委托并执行。
private void WTBtn_Click(object sender, EventArgs e)
{//实例化方式1GetNum num new GetNum(WTModel.Add);//使用方法1var a num(1, 2);//使用方法2var b num.Invoke(1, 2);
}
执行结果: 值得注意的是上述的委托执行方式都是同步的并不是说把方法给到委托就会自动开启新的线程。看下面执行例子:
private void WTBtn_Click(object sender, EventArgs e)
{//实例化方式1GetNum num new GetNum(WTModel.Add);//使用方法1var a num(1, 2);//使用方法2var b num.Invoke(1, 2);Console.WriteLine(我是一定是最后执行的);}执行结果可初步看出是在委托执行了两次Add方法调用后才打印最后一段文字的(当然此处并不严谨用于说明同步足够了): 那么如何异步执行呢 这里就不得不提BeginInvoke了 如下: private void WTBtn_Click(object sender, EventArgs e){//实例化方式1GetNum num new GetNum(WTModel.Add);//使用方法1var a num(1, 2);//使用方法2//倒数第二个参数为回调函数暂用null//最后一个参数是给回调函数传入参数的参数暂用null//IAsyncResult result num.BeginInvoke(1, 2, null, null);var b num.BeginInvoke(1,2,null,null);Console.WriteLine(我是不一定是最后执行的了);}
运行结果你看第二次调用Add就不一样了吧: BeginInvoke在NetCore不支持NetFamework支持 NetCore有更好的多线程功能来支持实现类似功能。所以在NET Core中需要自己手动去开启线程和实现异步。例如下面(在Famework里也可以这样使用异步): /// summary/// 定义委托/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic delegate Taskint GetNum(int a, int b);public static class WTModel{/// summary/// 加法/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic static Taskint Add(int a, int b){return Task.Run(() {Console.WriteLine(执行Add了方法);return a b;});}
} private void WTBtn_Click(object sender, EventArgs e){//实例化方式1GetNum num new GetNum(WTModel.Add);//使用方法1var a num(1, 2);//使用方法2var b num.Invoke(1,2);Console.WriteLine(我是不一定是最后执行的了);}
执行结果: 1.3:多播委托
所谓多播委托就是给委托传了多个方法执行委托的时候会按照传入的顺序依次执行方法当然传入的方法要注意错误处理否则中件某个方法异常会导致后续方法无法执行若委托有返回值返回的值是最后一个方法的返回值。
定义多播(或者-): private void WTBtn_Click(object sender, EventArgs e){//多播委托//实例化方式1GetNum num new GetNum(WTModel.Add);GetNum num1 WTModel.Multi;//实例化方式2num num1;num WTModel.Sub;var c num(1, 2);//调用一次会依次执行Add、Multi、Sub方法最终返回的值是最后一个委托的方法的返回值。} 1.4 实际应用
说了这么多委托到底好在哪里呢很多人都有这个疑问吧。下面举个例子就知道了 。
仍以上面定义的GetNum委托和其四个方法为基础。
正常我们要算加法直接使用Add方法不久一步到位了吗为何还需要多此一举定义个委托来完成调用呢这应该是很多看到这里的人的疑惑。
场景一:委托作为参数执行不同的方法这样在WTBtn_Click方法中就只用调用Use1就能计算不同的值:
private void WTBtn_Click(object sender, EventArgs e)
{Use1(1, 2, WTModel.Add);Use1(1, 2, WTModel.Sub);Use1(1, 2, WTModel.Multi);Use1(1, 2, WTModel.Division);
}private void Use1(int a, int b, GetNum num)
{var A num(1, 2);
} 场景2:实现根据不同地方输出产出的水果是啥
方法1if或者switch以switch为例:
private string Use(string name)
{string a ;switch (name){case 广州: a 苹果; break;case 重庆: a 香蕉; break;case 四川: a 梨; break;case 广西: a 西瓜; break;default: break;}return a;
} 使用:
Console.WriteLine(Use(广州));
方法2定义四个方法分别调用方法
public static class WTModel
{public static void GZ(string name){if (name 广州){Console.WriteLine(苹果);}}public static void CQ(string name){if (name 重庆){Console.WriteLine(香蕉);}}public static void SC(string name){if (name 四川){Console.WriteLine(梨);}}public static void GX(string name){if (name 广西){Console.WriteLine(西瓜);}}
}
使用:
private void WTBtn_Click(object sender, EventArgs e)
{string name 广州;WTModel.GZ(name);WTModel.GX(name);WTModel.CQ(name);WTModel.SC(name);}
方法3、使用委托:
定义委托和其四个方法 /// summary/// 定义委托/// /summary/// param namea/param/// param nameb/param/// returns/returnspublic delegate void GetName(string name);public static class WTModel{public static void GZ(string name){if (name 广州){Console.WriteLine(苹果);}}public static void CQ(string name){if (name 重庆){Console.WriteLine(香蕉);}}public static void SC(string name){if (name 四川){Console.WriteLine(梨);}}public static void GX(string name){if (name 广西){Console.WriteLine(西瓜);}}}
使用委托:
private void WTBtn_Click(object sender, EventArgs e)
{GetName get WTModel.GZ;get WTModel.GX;get WTModel.CQ;get WTModel.SC;Use(广州, get);
}private void Use(string name, GetName get)
{get.Invoke(name);
}
三个方法都可以实现根据地方不同输出相应水果。调用结果都是如下; 从三个方法写法和调用来看似乎方法一最为简单。
那么现在你的程序已经是开发好了这个时候突然来了两个需求。
需求1新增一个地方的水果:
方法一需要新增一行case代码 。
方法二需要新增一个方法。
方法三需要新增一个方法。
看起来仍是方法一简单但是 如果你使用的是是打包好的DLL文件那么你就没办法直接增加代码除非能重写方法。
需求2:在输出水果前先输出产地。
方法一 需要编辑每行case代码 。
方法二 需要编辑每个方法。
方法三 仅需在Use方法里新增一行即可。
若你使用的是是打包好的DLL文件且方法无法被重写那似乎仅方法三能满足需求。
1.5 事件
本来准备单独说的但事件本质是基于委托实现的观察者模式的应用。贴两个觉得可以的链接自行去看吧。
事件的理论即使用注意:C# 事件event_c# event-CSDN博客
事件的应用理解:分分钟用上C#中的委托和事件 - 雾中人 - 博客园
结语:个人认为委托的主要作用在于实现代码的重用业务的解耦保持代码的稳定性以及扩展性。暂时就说这么多吧仅个人理解。