我最近看一本小说《道诡异仙》,主角在去正德寺找和尚的路上遇到了一个乞丐样的假和尚。主角说他是不个和尚,那假和尚说,和尚剃发念经他也剃发念经,和尚守戒吃斋他也守戒吃斋,怎么他就不是和尚了?

是的,我在前段时间的工作中也遇到同事这样的发问:两个对象之间为什么不能互相赋值?我说是因为两个对象类型不一样。他说这两个对象里面字段一模一样,甚至值都快要一样了,怎么还算不同一个类型?

因为我们的强类型是C#,在C#的类型系统里,是不是某个类型,需要打上类型认证的标记,这个标记是与生俱来的,是可以继承的,但是不可以后天修改的。除此之外,即使属性完全一致、方法完全一致,也不能算是相同类型,或是某个接口。门第之间如天涧鸿沟不可逾越。为此我们需要通过反射之类的方式创建诸如AutoMapper之类的方法来让他们之间可以互相转换。

而在Python之类的动态语言里,鸭子类型又是另一种常识了。鸭子类型说的是,如果有个动物长得像鸭子,叫起来像鸭子,走起来像鸭子,那它就是鸭子。

可惜的是动态语言是在运行时判断类型是否符合的,这会使得范式约束会不那么严格,无法提前检查出错误。那就不得不夸夸golang了,对golang来说类型是静态的,但是interface的检查又是基于接口声明的而非标签式的,使得我们能灵活的构建类型以满足各种使用时候的约束,而这些检查又是在编译时可以完成的。基于一些哲学的意识形态上的立场的原因,我是相当喜欢golang的这一特性了。

 

posted @ 2025-01-17 21:25 陈惊蛰 阅读(26) 评论(0) 推荐(0) 编辑
摘要: C#6.0引入了Null条件运算符: obj?.Invoke(); 等价于 if(obj != null) obj.Invoke(); 即遇到null时短路。 于是,我不假思索地写下了这样的代码:① await obj?.InvokeAsync(); 遇到null时短路嘛,我以为是等价于这样:② i 阅读全文
posted @ 2024-01-26 10:42 陈惊蛰 阅读(213) 评论(1) 推荐(1) 编辑
摘要: 一、单元测试项目如何创建 VisualStudio新建项目,项目类型选择测试。 可以看到有许多选项,都大差不差。 这里选择xUnit。 项目名使用要测试的项目名加上“.Tests”后缀。 二、进行单元测试 首先明确测试对象,通常是针对一个类型进行测试,新建Test类,类名为测试对象的类名加上“Tes 阅读全文
posted @ 2023-12-27 11:28 陈惊蛰 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 一、消息处理的command模式 首先设定一个消息包结构中必包含key字段,表明该消息需要由什么处理器来处理。 在aspnetcore-webapi中,通过解析http消息包中的请求url获得path,最终路由确定处理函数在controller-action中。 在有些框架中,喜欢使用command 阅读全文
posted @ 2022-11-29 17:20 陈惊蛰 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 自带的icon组件是这样的:<icon type="waiting" size="93" color="yellow"></icon>type是有限的几种。如果要使用自定义的话,可以使用图片等等方式,这里记一下使用矢量字体的方法。首先是大本营:https://www.iconfont.cn/然后盯住 阅读全文
posted @ 2021-09-03 10:08 陈惊蛰 阅读(73) 评论(0) 推荐(0) 编辑
摘要: WPF没有Vue中好用的v-if/v-else是很可惜的,虽然razor里有。 这时候一般使用Visiblity属性控制控件的显示。这在控件A和B需要动态切换显示、隐藏的时候很有用。 但是如果是在ListBox/ListView里的话,如果里面的Item需要根据条件用不同的Template渲染的时候 阅读全文
posted @ 2021-08-12 16:02 陈惊蛰 阅读(1118) 评论(0) 推荐(0) 编辑
摘要: 其实ListBox和ListView在这里是一样的。 1、使用方法ScrollIntoView ListView继承自ListBox,ListBox有这个方法,可以滚动到指定的item。 listBox.ScrollIntoView(listBox.Items[listBox.Items.Count 阅读全文
posted @ 2021-08-12 15:35 陈惊蛰 阅读(3635) 评论(1) 推荐(1) 编辑
摘要: 举个例子,实现一个用户头像的Image控件,绑定的是url。而我的需求是下载url的图片,做本地缓存,再显示。 Converter实现需要继承自IValueConverter,而它的两个接口都是同步,而下载函数是异步async的。此时在Convert函数实现内使用await关键词是不允许的。 解决方 阅读全文
posted @ 2021-08-10 16:47 陈惊蛰 阅读(339) 评论(0) 推荐(0) 编辑
摘要: 常见案例是MySql.Data和MySqlConnector。 比如一般的orm for mysql用的是mysql.data,而Pomelo.EFCore.MySql用的是MySqlConnector。当同时引用这两个类库的时候,如果需要new MySqlConnection()可能就会发生冲突了 阅读全文
posted @ 2021-08-10 08:41 陈惊蛰 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 1、引入 包:Microsoft.Extensions.Hosting.WindowsServices 参考:https://devblogs.microsoft.com/ifdef-windows/creating-a-windows-service-with-c-net5/ 代码:UseWind 阅读全文
posted @ 2021-08-07 00:21 陈惊蛰 阅读(97) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示