GetHashCode的用处 首先声明一下,这里的GetHashCode是Object.GetHashCode,是需要在对象中定义的函数。...这个函数在对象被插入到字典Dictionary或者HashSet之类的哈希表中的时候会被调用,用于生成hash键值。...为什么不能使用默认的GetHashCode 直接使用默认的ValueType的GetHashCode实现容易造成哈希冲突,这样的Object在配合哈希表这类数据结构使用的时候会出现性能问题。...hash.Add(Age); hash.Add(Name); return hash.ToHashCode();; } } 利用元组 要求C#...除了上面的还可以: new { Age, Name }.GetHashCode(); 但是这样会触发GC,因为在堆上分配内存了。这是用到了C#的匿名类型来实现的。
本文来聊聊在重写某个类的 GetHashCode 方法时,可以如何实现 GetHashCode 的返回值 按照 GetHashCode 方法的原则,要求两个对象如果 Equals 返回 true 那么一定要求...GetHashCode 也返回相同的值。...当然,反过来不成立,也就是两个对象返回的 GetHashCode 的值相同,对象可以是不相等的 实现 GetHashCode 方法的方式有很多,最简单的就是通过调用基类的 GetHashCode 方法,...类型的,也就是调用了 object 的 GetHashCode 方法,其实和调用 RuntimeHelpers 的 GetHashCode 方法是相同的,因为在 object 方法里面的 GetHashCode...private double Foo1 { get; } 此时如需要将 Foo1 属性加入到 HashCode 可以使用如下代码 var hashCode = new HashCode
VB本身的字符串格式就是Unicode,用Winsock发送字符串的话,会默认把字符串转换为Ansi的格式进行发送。Ansi格式,对于英文符号等仍然使用单字节,汉字使用双字节。...如果需要进行转换的话,可以用StrConv来进行。 ...不过如果要发送Unicode格式的字符串的话,这样是不行的,实际发送的是ansi的。其实如果要发送unicode的字符串的话,只要这样就可以了。
从C#到TypeScript - 类型 TypeScript和C#一样是微软搞出来的,而且都是大牛Anders Hejlsberg领导开发的,它们之间有很多共同点,现在尝试以C#程序员的角度来理解下TypeScript...现在来看下TypeScript基础类型: 数值 C#的数字类型有好几种:int, long, float, double, byte等,而TypeScript和JavaScript一样,所有的数字都是浮点数...功能上和C#差不多: 目的都是为数值提供一个友好的名字,增加代码可读性和可重构性 默认情况下从0开始编号 也可以手动赋值 可以实现类似C# Flag特性 但也有一些细节不一样: C#的枚举值toString...C#配合linq那么强大,不过配合其他一些库如lodash也可以很方便的进行各种操作。...C#,不过叫法上是分开的,这里的元组只是对数组的处理,另外还有对象上的叫解构赋值,以后会写。
从C#到TypeScript - Proxy 我们知道在C#中要实现代理功能需要自己来实现代理类,并且每个类需要不同的代理类,使用起来不方便,虽然借助一些AOP框架可以一定程度实现拦截,但毕竟框架级别的还是太重了...,没错,Reflect里的操作Proxy里都同样有一份,这样在做Proxy的时候,如果要回到原始的结果,直接调用Reflect对应的操作就好。...第二个参数是指上下文的this,this的不同会可能导致函数里变量值的不同。...Test1的func,所以第一条输出为call test1 func,虽然Proxy代理的是Test1的func,但实际执行时传的this是t2,所以函数里的this指向了Test2,取的也就是test2...上面介绍了几个常用的,其他的意思也很明显就不多说了,Proxy的应用场景除了上面说过的MVVM外,还可以用在ORM中,把对象的行为映射到数据库中,还有数据访问的代理,总之想用到代理的可以考虑Proxy。
从C#到TypeScript - Reflect 在C#里如果想只通过名字来生成类实例、获取属性或执行方法可以使用反射,反射是基于元数据,现在很多流行语言都支持元数据,以此来提供更多便利的功能。...ES6和TypeScript也有Reflect,不过因为JavaScript本身是解释型语言,很多操作如根据名字字符串获取属性,根据字符串执行函数这些原本就有支持,Reflect只是把这些操作归结到一起...Set 定义如下: Reflect.get(target, name, receiver); Reflect.set(target, name, value, receiver); 看上去也很好理解,和C#...对于delete,需要注意的是deleteProperty对class的属性是无效的。 has ownKeys ownKeys返回的是对象所有属性,包括不可枚举的,如Symbol之类。...Reflect.preventExtensions(target) 让一个对象变为不可扩展 Reflect基本上就是把之前Object的方法和一些命令如delete in之类聚到一起,相信ES6之后用
从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌套不仅让代码读起来十分困难,维护起来也很不方便...其实C#在Task出现之前也是有类似场景的,Async Programming Mode时代,用Action和Func做回调也很流行,不过也是意识到太多的回调嵌套代码可读性差且维护不易,微软引入了Task...,并没有多余的状态转换。...这两种转换都是由异步返回的结果给定的,成功取回数据就是resolved,取数据出异常就是rejected。...也因此,这转换过后的结果就是固定的了,不可能在转换过后还会变回pending或其他状态。
从C#到TypeScript - function 虽然TypeScript里有了类,但JavaScript的function也还在,这也是和C#的不同所在。...C#里函数不能脱离类工作,但TypeScript的function和JavaScript一样,可以单独工作。...同C#里的函数参数可以有默认值一样,TypeScript也支持,并且还支持可空参数。...TypeScript同样可以通过剩余参数来支持,形式上类似于C#的param。 剩余参数的格式是...restParam: string[]。...泛型函数 同C#一样支持泛型函数,写法也差不多。
从C#到TypeScript - 接口 为了更好的抽象出行为和属性,TypeScript在ES6的基础上增加了接口interface。...C#也有interface,不过TypeScript的接口还不大一样,C#里的接口一般是为类服务,让类实现接口中定义的方法或属性。...类的接口 这和C#的差不多,描述了公共的成员;不过实现接口语法有点类似于Java,用的是implements。...接口的属性可以定义为readonly,这个和C#里只有get没有set的属性有点像,同样,实现接口的类也不一定需要readonly。...从实现上看有点类似于C#的delegate。
从C#到TypeScript - 类 在ES6之前Javascript的类都是用function定义的,ES6把类关键字正式加进来,虽说其实也还是function,不过代码可读性上好了不少。...不过不同的是C#类的成员默认是private,而TypeScript默认是public。 在类里面所有成员都必须用this来访问。...u.checkLogin()); // true u.name = 'test'; console.info(u.checkLogin()); // false 参数属性 上面的User类有两个成员,而且都是从构造函数赋值的...兼容性 TypeScript里的类是有兼容性的,这点和C#很不一样,TypeScript认为:只有成员的类型是兼容的,那它们的类型也是兼容的。...C#或Java可以说十分相似,除了兼容性基本上没有什么新的东西,不过对于JavaScript来说却是一大进步了。
从C#到TypeScript - Generator 上篇讲了Promise,Promise的执行需要不停的调用then,虽然比callback要好些,但也显得累赘。...,function后面多了一个*,变成了function*,函数体用到了yield,这个大家比较熟悉,C#也有,返回可枚举集合有时会用到。...在ES6里yield同样表示返回一个迭代器,所以用到的时候会用next()来顺序执行返回的迭代器函数。...而且线程是资源抢占式的,而协程则是合作式的,怎样执行是由协程自己决定。 由于JavaScript是单线程语言,本身就是一个不停循环的执行器,所以它的协程是比较简单的,线程和协程关系是 1:N。...继续输出第二个,按正常想法,应该输出3,但是由于yield 1是上一轮计算的,这轮碰到上一轮的yield时返回的总是undefined。
从C#到TypeScript - 变量 TypeScript的变量声明和ES6差不多,相比之前主要是多了let和const 为什么不用var 不管是TypeScript还是ES6都会兼容以前的javascript...虽然C#里也有var,但和JavaScript的可不一样,var在javascript里会有一些奇怪的表现,比如会置前,而且作用域是整个函数,可以不写var来声明变量,然后变量变成全局。...这些都可能会带了一些不容易注意到的问题。...,跑出来的结果全是10,这是因为var出来的i的作用域是整个函数。 这就导致循环完成后i变成10,setTimeout内的函数才被执行,所以结果都是10了。...const C#也有const,意义上差不多,都是常量,不想变量被改变。
从C#到TypeScript - async await 上两篇分别说了Promise和Generator,基础已经打好,现在可以开始讲async await了。...async await是ES7的议案,TypeScript在1.7版本开始支持async await编译到ES6,并在2.1版本支持编译到ES5和ES3,算是全面支持了。...async await 用法 和C#里的十分相似,看个例子: function delay(): Promise{ return new Promise((resolve...async function run(){ await Promise.reject('error'); // 这里出异常 console.info('continue'); // 不会执行到这里...this, void 0, void 0, function* () { yield delay(); console.info('run'); }); } 可以注意到其实还是用
C# vs TypeScript - 高级类型 上一篇讲了基础类型,基本上用基础类型足够开发了,不过如果要更高效的开发,还是要看下高级类型,这篇和C#共同点并不多,只是延用这个主题。...联合类型 可以从字面上进行理解:其实就是多个类型联合在一起,用|符号隔开。 如: string | number, 表示希望这个类型既可以是string,又可以是number。...extend(new Person(), new Dog()); console.info(personDog.talk()); console.info(personDog.bark()); 类型转换...C#里常用的类型转换一个是前面圆括号加类型,一个是as。...= System.Generic.List做个别名,不过还是不一样,C#的是可以实例化的。
从C#到TypeScript - 装饰器 在C#里面如果想要不直接修改类或方法,但给类或方法添加一些额外的信息或功能,可以想到用Attribute,这是一个十分方便的功能装饰器。...function Testable(target: Function) { // 类、方法、属性、方法参数的参数各不相同 //这里可以记录一些信息到target,或者针对target做一些处理,...方法装饰器 方法装饰器的使用方法和类装饰器类似,只是参数不一样,方法装饰器有三个参数: 如果装饰的是静态方法,则是类的构造函数,如果是实例方法则是类的原型。 方法的名字。...即属性描述符,有 configurable 是否可以配置,如动态添加删除函数属性之类 writable 是否可写,可以用来设置只读属性 enumerable 是否可枚举,即是否能在for...in中能枚举到...,最后一个参数是所装饰的参数的位置。
前言 使用sql代码作分析的时候,几次遇到需要将长格式数据转换成宽格式数据,一般使用left join或者case when实现,代码看起来冗长,探索一下,可以使用更简单的方式实现长格式数据转换成宽格式数据...长格式数据:长数据中变量的ID没有单独列成一列,而是整合在同一列。...需求实现思路 步骤一:将客户信息转化成map格式的数据u001 {"age":"25","education":"master","first_buytime":"2018/1/3","name":"..., detail)))) message1 from user_info group by user_no order by user_no collect_set形成的集合是无序的...总结 长格式数据转换成宽格式数据,首先将数据转化成map格式数据,然后使用列名['key']得到每一个key的value。当然,也可以使用case when函数实现以及left join函数实现。
今天将给大家带来实际项目中经常运用的技术—C# 如何使用创建Windows服务进行应用程序开发。...如果你觉得阿笨的《C# Windows服务开发从入门到精通》分享课程只是仅仅带领大家学习"C#如何一步一步的创建Windows服务应用程序的话,那么你就大错特错了。...废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖的知识点 2.1、 C# Windows服务应用程序开发零基础上手入门实战演练。...2.2、通过第三方组件 (Topshelf)创建C# Windows服务应用程序。 2.3、分享C# Windows服务编程在实际项目中的一些小技巧和小技能。...四、源码在线解读和演示 4.1、 C# Windows服务应用程序开发零基础上手入门实战演练。 4.1.1、C#编写的Windows服务基本应用流程如下: 1)、如何编写windows服务程序。
枚举在C#中都会用到,但是你是否想过,枚举之间怎么转换?这篇文章我就来说一下枚举之间的转换。...C# 是不支持不同枚举之间的转换的,但是 CLR 支持,因此我们可以利用 CLR 赋值的兼容性来实现枚举之间的转换。...void Main() { Country1[] c1 = (Country1[])(Array) new Country2[50]; } } 上面代码十分简单,主要是利用了 Array 来进行操作的。...需要注意的是两个枚举类型不许具有相同的基类型才可以利用这个方法转换。 在实际项目中枚举之间转换几乎没什么用,并且有可能出现意想不到的结果。
作为.NET程序员,往往习惯使用一种语言(据我观察,2006年后的程序员习惯用C#,之前的喜欢VB)。而对于另一种语言虽然能读懂但是写起来总是比较费事。...尤其面对旧的项目升级或者才考其他网上的开源资源的时候,总会很麻烦。于是诞生了很多VB和C#互转的工具,例如Developerfusion的CsharpToVB工具。...不过那是在线版本的,可能受到网络条件限制,反应很慢或者干脆由于禁网无法访问。综上,我准备自己写一个C#和VB的互转工具,方便大家使用。 工具简介 该工具主要针对文件夹,进行批量转换。...它能把SourceDirectory文件夹以及所有子文件夹下的C#和VB文件,按照原有目录结构转换后,保存到TargetDirectory中。...其中转换功能基本等同于developerfusion的工具。
从DeviceNET到CANopen:我在烟草车间的协议转换实践我蹲在电控柜前,指尖还残留着刚才拧紧最后一个接线端子时的触感。空气中弥漫着烟草特有的焦甜气息,与金属和绝缘漆的味道交织在一起。...二、解决方案:定制化网关的精准调教经过反复对比测试,我最终选择了一款专门针对工业场景开发的DNET到COPN网关。...三、应用效果:数据说话最有说服力实际运行一个月后,数据记录令人振奋:响应性能:指令传输延迟从原来的120ms降低到18ms,变频器响应速度提升85%。...维护成本:无需额外配置协议转换柜,节省安装空间60%。调试时间从预计的5天缩短到2天,老王笑着说:"这次终于不用天天爬电控柜了!"...选择专用网关而非通用设备,虽然前期投入高30%,但带来的稳定性提升和运维成本降低使得投资回报周期缩短到不足半年。