Hello World
Spiga

归档:2013年04月

防止装箱落实到底,只做一半也是失败

2013-04-10 22:21 by 老赵, 11408 visits
摘要:.NET提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举一个真实的例子:假设我们要将一对int作为字典的键,用于映射到某些数据,那么你会怎么做?当然我们可以直接使用Tuple<int, int>,但这样就可能产生大量的对象。于是我们打算使用自定义的值类型,但简单这么做其实并不一定能满足我们的要求。 阅读全文

为什么我不喜欢Go语言式的接口(即Structural Typing)

2013-04-10 18:37 by 老赵, 17093 visits
摘要:所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。 阅读全文

为什么我认为goroutine和channel是把别的平台上类库的功能内置在语言里

2013-04-09 13:52 by 老赵, 12195 visits
摘要:这几天看了《Go语言编程》这本书,感觉一般,具体可见发表在图灵社区里的书评。书评里面我提到“Go语言的goroutine和channel其实是把别的语言/平台上类库的功能内置到语言里”,这句话当然单单这么说出来是没什么价值的,于是我也就趁热把它说得再详细一些。我的看法简而言之是:由goroutine和channel所带来的主要编程范式、设计思路等等,其实基本都可以在其他一些平台中配合特定的类库来实现。 阅读全文

如何在不装箱的前提下调用“显式”实现的接口方法?(答案)

2013-04-07 13:51 by 老赵, 5172 visits
摘要:其实已经有不少同学抓住了关键,那就是使用泛型,不过有些同学提出Dispose<T>(T obj) where T : IDisposable这样的做法。我们没有进行类型转化,只是让运行时可以“认识到”类型T实现了IDisposable接口,这自然可以在不装箱的情况下调用其成员。可惜的是,这种做法的“意识”到位了,却是错误的,原因在于忽视了值类型传参的特点:复制所有内容。换句话说,这个辅助方法内部所使用的obj其实是一个副本,而不是原来的参数对象。假如被调用的成员会修改自身状态——尽管这对于值类型来说是一种极差的设计——这便会产生问题,所以正确的方法应该使用ref关键字来修饰参数。 阅读全文
1
使用Live Messenger联系我