总结
- 对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
-
算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈…(最好多刷一刷,不然影响你的工资和成功率???)
-
在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。
-
要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
第一次跳槽十分忐忑不安,和没毕业的时候开始找工作是一样的感受,真的要相信自己,有条不紊的进行。如果有我能帮忙的地方欢迎随时找我,比如简历修改、内推、最起码,可以把烦心事说一说,人嘛都会有苦恼的~
祝大家都有美好的未来,拿下满意的 offer。
如果既想使用-=和+=的方便,又想避免相关功能开闭的风险怎么办呢?可以使用事件:
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方法一样,对事件的绑定与移除进行条件约束。
- 控制绑定事件的执行
当多个委托被绑定到事件之后,如果想精确控制各个委托的运行怎么办,比如返回值(虽然经常为void)、异常处理等。
第一章第4节通过一个List 模拟了多播委托的绑定。 会想到如果真能循环调用一个个已绑定的委托,就可以精确的进行控制了。那么这里说一下这样的方法:
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);
- 标准的事件写法
.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#版本改变
==========
- C#2.0 泛型委托
C#2.0 的时候,随着泛型出现,支持了泛型委托,例如,在委托的签名中可以使用泛型,例如下面代码
public delegate string SendDelegate<T>(T message);
这样的委托适用于不同的参数类型,例如如下代码(注意使用的时候要对应具体的类型)
public delegate string SendDelegate<T>(T message); public class HR1 { public SendDelegate<string> sendDelegate1; public SendDelegate<int> sendDelegate2; public SendDelegate<DateTime> 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 SendDelegate<int>(Sender1.Send2); hr1.sendDelegate3 = delegate (DateTime dateTime) { return dateTime.ToLongDateString(); }; } }
- C#2.0 delegate运算符
delegate
运算符创建一个可以转换为委托类型的匿名方法:
例如上例中这样的代码:
hr1.sendDelegate3 = delegate (DateTime dateTime) { return dateTime.ToLongDateString(); };
- C#3.0 Lambda 表达式
从 C# 3 开始,lambda 表达式提供了一种更简洁和富有表现力的方式来创建匿名函数。 使用 => 运算符构造 lambda 表达式,
例如“delegate运算符”的例子可以简化为如下代码:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。