当前位置: 首页 > news >正文

怎么用PS做网站广告图聚美优品网站开发时间进度表

怎么用PS做网站广告图,聚美优品网站开发时间进度表,软件平台运维方案,中国十大网络科技公司排名委托与事件在C#1.0的时候就有了#xff0c;随着C#版本的不断更新#xff0c;有些写法和功能也在不断改变。本文温故一下这些改变#xff0c;以及在NET Core中关于事件的一点改变。一、C#1.0 从委托开始1. 基本方式什么是委托#xff0c;就不说概念了#xff0c;用例子说话… 委托与事件在C#1.0的时候就有了随着C#版本的不断更新有些写法和功能也在不断改变。本文温故一下这些改变以及在NET Core中关于事件的一点改变。一、C#1.0 从委托开始1. 基本方式  什么是委托就不说概念了用例子说话。  某HR说他需要招聘一个6年 .NET5 研发经验的“高级”工程师他想找人委托别人把这条招聘消息发出去。这样的HR很多所以大家定义了一个通用的发消息规则public delegate string SendDelegate(string message);  这就像一个接口的方法没有实际的实现代码只是定义了这个方法有一个string的参数和返回值。所有想发招聘消息的HR只要遵守这样的规则即可。委托本质上是一个类所以它可以被定义在其他类的内部或外部根据实际引用关系考虑即可。本例单独定义在外部。为HR定义了一个名为HR的类public class HR {public SendDelegate sendDelegate;public void SendMessage(string msg){sendDelegate(msg);} }HR有一个SendDelegate类型的成员当它需要发送消息SendMessage的时候只需要调用这个sendDelegate方法即可。而不需要实现这个方法也不需要关心这个方法是怎么实现的。当知道这个HR需要发送消息的时候猎头张三接了这个帮忙招人的工作。猎头的类为Sender他有一个用于发送消息的方法Send该方法恰好符合众人定义的名为SendDelegate的发消息规则。这有点像实现了一个接口方法但这里不要求方法名一致只是要求方法的签名一致。public class Sender {public Sender(string name){this.senderName name;}private readonly string senderName;public string Send(string message){string serialNumber Guid.NewGuid().ToString();Console.WriteLine(senderName sending....);Thread.Sleep(2000);Console.WriteLine(Sender: senderName , Content: message , Serial Number: serialNumber);return serialNumber;} } 猎头帮助HR招人的逻辑如下public void Test() {//一个HRHR hr new HR();//猎头张三来监听听到HR发什么消息后立刻传播出去Sender senderZS new Sender(张三);hr.sendDelegate senderZS.Send; //HR递交消息hr.SendMessage(Hello World); } 猎头将自己的发消息方法“赋值”给了HR的SendDelegate方法为什么可以“赋值” 因为二者都遵守SendDelegate规则。 就像A和B两个变量都是int类型的时候A可以赋值给B一样。这就是一个简单的委托过程HR将招人的工作委托给了猎头自己不用去做招人的工作。但经常一个招聘工作经常会有多个猎头接单那就有了多播委托。2. 多播委托 看一下下面的代码public void Test() {//一个HRHR hr new HR();//猎头张三来监听听到HR发什么消息后立刻传播出去Sender senderZS new Sender(张三);hr.sendDelegate senderZS.Send;//快嘴李四也来了Sender senderLS new Sender(李四);hr.sendDelegate senderLS.Send;//HR递交消息hr.SendMessage(Hello World); } 与之前的代码改变不大 只是添加了李四的方法绑定这样HR发消息的时候张三和李四都会发出招人的消息。这里要注意李四绑定方法的时候用的是而不是就像拼接字符串一样是拼接而不是赋值否则会覆盖掉之前张三的方法绑定。对于第一个绑定的张三可以用号也可以用记得之前好像第一个必须用实验了一下现在二者皆可。这同时也暴露了一些问题如果后面的猎头接单的时候不小心故意用了号 那么最终前面的人的绑定都没有了那么他将独占这个HR客户HR发出的消息只有他能收到。可以偷偷的调用猎头的hr.sendDelegatepublic void Test() {//一个HRHR hr new HR();//大嘴张三来监听听到HR发什么消息后立刻传播出去Sender senderZS new Sender(张三);//hr.sendDelegate - senderZS.Send; //即使未进行过 直接调用-也不会报错hr.sendDelegate senderZS.Send;//快嘴李四也来了Sender senderLS new Sender(李四);hr.sendDelegate senderLS.Send;//移除//hr.sendDelegate - senderZS.Send;//风险注意上面用的符号是和- 如果使用则是赋值操作//例如下面的语句会覆盖掉之前所有的绑定//hr.sendDelegate senderWW.Send;//HR递交消息hr.SendMessage(Hello World);//风险可以偷偷的以HR的名义偷偷的发了一条消息 sendDelegate应该只能由HR调用 hr.sendDelegate(偷偷的发一条);} 3. 通过方法避免风险  很自然想到采用类似Get和Set的方式避免上面的问题。既然委托可以像变量一样赋值那么也可以通过参数来传值将一个方法作为参数传递。public class HRWithAddRemove{private SendDelegate sendDelegate;public void AddDelegate(SendDelegate sendDelegate){this.sendDelegate sendDelegate; //如果需要限制最多绑定一个此处可以用号}public void RomoveDelegate(SendDelegate sendDelegate){this.sendDelegate - sendDelegate;}public void SendMessage(string msg){sendDelegate(msg);}} 经过改造后的HRSendDelegate方法被设置为了private之后只能通过Add和Remove的方法进行方法绑定。4.模拟多播委托机制通过上面委托的表现来看委托就像是保存了一个相同方法名的集合 ListSendDelegate 可以向集合中添加或移除方法当调用这个委托的时候会逐一调用该集合中的各个方法。例如下面的代码( 注意这里假设SendDelegate只对应一个方法 )public class HR1 {public void Delegate(SendDelegate sendDelegate){sendDelegateList new ListSendDelegate { sendDelegate }; //对应}public void AddDelegate(SendDelegate sendDelegate){sendDelegateList.Add(sendDelegate); //对应}public void RomoveDelegate(SendDelegate sendDelegate){sendDelegateList.Remove(sendDelegate);//对应-}public ListSendDelegate sendDelegateList;public void SendMessage(string msg){foreach (var item in sendDelegateList){item(msg);}} } 二、C#1.0 引入事件  1.简单事件  如果既想使用-和的方便又想避免相关功能开闭的风险怎么办呢可以使用事件public class HRWithEvent{public event SendDelegate sendDelegate;public void SendMessage(string msg){sendDelegate(msg);}}只是将SendDelegate前面添加了一个event标识虽然它被设置为public但如下代码却会给出错误提示 事件“HRWithEvent.sendDelegate”只能出现在 或 - 的左边(从类型“HRWithEvent”中使用时除外)  hr.sendDelegate senderZS.Send;hr.sendDelegate(偷偷的发一条);2.事件的访问器模式   上文为委托定义了Add和Remove方法而事件支持这样的访问器模式例如如下代码public class CustomerWithEventAddRemove{private event SendDelegate sendDelegate;public event SendDelegate SendDelegate{add { sendDelegate value; }remove { sendDelegate - value; }}public void SendMessage(string msg){sendDelegate(msg);}}可以像使用Get和Set方法一样对事件的绑定与移除进行条件约束。   3. 控制绑定事件的执行  当多个委托被绑定到事件之后如果想精确控制各个委托的运行怎么办比如返回值虽然经常为void、异常处理等。第一章第4节通过一个ListSendDelegate 模拟了多播委托的绑定。 会想到如果真能循环调用一个个已绑定的委托就可以精确的进行控制了。那么这里说一下这样的方法public class HRWithEvent{public event SendDelegate sendDelegate;public void SendMessage(string msg){//sendDelegate(msg); 此处不再一次性调用所有if (sendDelegate ! null){Delegate[] delegates sendDelegate.GetInvocationList(); //获取所有已绑定的委托foreach (var item in delegates){((SendDelegate)item).Invoke(msg); //逐一调用}}}}这里通过Invoke方法逐一调用各个Delegate从而实现对每一个Delegate的调用的控制。若需要异步调用则可以通过BeginInvoke方法实现.NET Core之后不再支持此方法后面会介绍。((SendDelegate)item).BeginInvoke(msg,null,null);  4. 标准的事件写法  .NET 事件委托的标准签名是void OnEventRaised(object sender, EventArgs args);   返回类型为 void。 事件基于委托而且是多播委托。 参数列表包含两种参数发件人和事件参数。 sender 的编译时类型为 System.Object。  第二种参数通常是派生自 System.EventArgs 的类型.NET Core 中已不强制要求继承自System.EventArgs后面会说到。  将上面的例子修改一下改成标准写法大概是下面代码的样子public class HRWithEventStandard {public delegate void SendEventHandler(object sender, SendMsgArgs e);public event SendEventHandler Send;public void SendMessage(string msg){var arg new SendMsgArgs(msg);Send(this,arg); //arg.CancelRequested 为最后一个的值 因为覆盖} }public class SendMsgArgs : EventArgs {public readonly string Msg string.Empty;public bool CancelRequested { get; set; }public SendMsgArgs(string msg){this.Msg msg;} } 三、随着C#版本改变1. C#2.0 泛型委托  C#2.0 的时候随着泛型出现支持了泛型委托例如在委托的签名中可以使用泛型例如下面代码public delegate string SendDelegateT(T message);这样的委托适用于不同的参数类型例如如下代码注意使用的时候要对应具体的类型public delegate string SendDelegateT(T message);public class HR1 {public SendDelegatestring sendDelegate1;public SendDelegateint sendDelegate2;public SendDelegateDateTime sendDelegate3; }public static class Sender1 {public static string Send1(string msg){return ;}public static string Send2(int msg){return ;} }public class Test {public void TestDemo(){HR1 hr1 new HR1();hr1.sendDelegate1 Sender1.Send1; // 注意使用的时候要对应具体的类型hr1.sendDelegate2 new SendDelegateint(Sender1.Send2);hr1.sendDelegate3 delegate (DateTime dateTime) { return dateTime.ToLongDateString(); };} } 2. C#2.0 delegate运算符delegate 运算符创建一个可以转换为委托类型的匿名方法例如上例中这样的代码hr1.sendDelegate3 delegate (DateTime dateTime) { return dateTime.ToLongDateString(); };3. C#3.0 Lambda 表达式从 C# 3 开始lambda 表达式提供了一种更简洁和富有表现力的方式来创建匿名函数。 使用  运算符构造 lambda 表达式,例如“delegate运算符”的例子可以简化为如下代码hr1.sendDelegate3 (dateTime) { return dateTime.ToLongDateString(); }; 4.C#3NET Framework3.5Action 、Func、PredicateAction 、Func、Predicate本质上是框架为我们预定义的委托在上面的例子中我们使用委托的时候首先要定义一个委托类型然后在实际使用的地方使用而使用委托只要求方法名相同在泛型委托出现之后“定义委托”这一操作就显得越来越累赘为此系统为我们预定义了一系列的委托我们只要使用即可。例如Action的代码如下实际上定义了最多16个参数的无返回值的委托。Func与此类似是最多16个参数的有返回值的委托。Predicate则是固定一个参数以及bool类型返回值的委托。public delegate bool PredicateT(T obj); 5. .NET Core 异步调用第2.3节中提示如下代码在.NET Core中已不支持((SendDelegate)item).BeginInvoke(msg,null,null); 会抛出异常System.PlatformNotSupportedException:“Operation is not supported on this platform.” 需要异步调用的时候可以采用如下写法Task task Task.Run(() ((SendDelegate)item).Invoke(msg)); 对应的 EndInvoke() 则改为 task.Wait();   5. .NET Core的 EventHandlerTEventArgs.NET Core 版本中EventHandlerTEventArgs 定义不再要求 TEventArgs 必须是派生自 System.EventArgs 的类 使我们使用起来更为灵活。例如我们可以有这样的写法EventHandlerstring SendNew 这在以前的版本中是不允许的。
http://www.pierceye.com/news/551720/

相关文章:

  • shopify做全品类网站提交链接
  • 网站建设和运营哪家公司好宠物医疗设计素材网站
  • 泰州网站制作公司中国空间站机械臂
  • 信誉好的常州网站建设网监备案网站更换域名
  • 淮南品牌网站建设电话南昌网站建设q479185700棒
  • 富阳区住房和城乡建设局网站广州市住房保障和房屋管理局
  • 江门建设局网站上海住房和城乡建设部网站
  • 开一个网站需要什么建设商务网站的方案
  • asp.net网站开发 pdf全球互联网中心在哪里
  • 做外贸网站要有域名学什么可以做网站
  • 服装高级定制品牌app排名优化
  • 济南推广网站建设保定seo网络推广
  • 网站运营策略wordpress调用友情链接
  • 网站流量下降原因京津冀协同发展四区指的是
  • 北滘网站设计网站建设应解决的问题
  • 网站建设空间申请wordpress 学校主题
  • 长沙市建设工程质量安全监督站官方网站做网站入门看什么书
  • 网站设计 素材代账行业门户网站开发
  • 旅游公司网站开发与实现如何建立公司网站
  • 专门做金融培训的网站有哪些wordpress注册没反应
  • 网站备案部门建设厅焊工证什么样子
  • 南宁市建设工程质量监督站网站设计模式
  • 做理财的网站科技公司网站模板官网
  • 在线网站建设课程济宁网站建设 企诺
  • 北京专业网站制作技术手机网站建好怎么发布
  • 谷歌网站建站wordpress 页面和文章
  • 网站建设基本目标如何建设 linux 网站
  • 电子商务网站开发 php汕头 网站建设
  • 郑州做网站的论坛山西利用模板建站
  • 网站引流.定期报告系统下载官网