发表于2008年12月的文章

Java与.NET集合框架的比较

发表于2008年12月23日


Java 中的实现
Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Interfaces Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Map HashMap TreeMap LinkedHashMap

与之对比

C5中的实现
Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Interfaces ICollection HashSet TreeSet HashedLinkedList
IList ArrayList LinkedList
IDictionary HashDictionary TreeDictionary LinkedHashMap

java.util.Collection<T>对应 C5中的C5.ICollection

C5只读模式的集合

GuardedCollection<T>
GuardedList<T>
GuardedDictionary<K,V>

C5在线文档,其中有很好的注释讲解各种数据结构。在线版本可能不完整,但很方便。更多信息请参见C5项目主页

使用.NET泛型集合(Generic Collection)

发表于2008年12月23日

StackOverflow上看到一个关于泛型类型检查的问题
定义一个泛型类时,可以使用where关键字对初始化时用做类型参数(type arguments)的类型加以约束(constraints )。如果不符合约束则抛出编译时错误(compile-time error)。
支持的约束有:

约束 描述
where T : struct 类型参数必须是值类型。除了Nullable
where T : class 类型参数必须是引用类型,包括类、接口、委托和数组。
where T : new() 类型参数必须包含一个公共的无参构造函数,这个约束必须放在所有的其他约束之后。
where T : <base_class_name> 类型参数必须是此基类或者此基类的派生类
where T : <interface_name> 类型参数必须实现指定接口,可以指定多接口,或者泛型接口。
where T : U T的类型参数必须是U,或者U的类型参数派生类。所谓裸类型约束(naked type constraint)。

.NET泛型支持,泛型参数,泛型接口,泛型方法等。Code Project上一篇讲解.Net泛型集合的文章

C5项目
CollectionBase应该是Java中的Set,是众多集合的基类。

Java集合与C5集合对比

Java中的 C5中的
java.util.Set C5.CollectionBase
java.util.HashSet C5.HashSet
java.util.List C5.IList
java.util.TreeSet C5.TreeSet
java.util.Collection C5.ICollection
java.util.Map C5.IDictionary

使用1:

Set newHead = new HashSet();

使用2:

Map head = new HashMap();
for (Collection entries : head.values())
{
    // ...
}

使用3:

public static  List asList(T... a) {
    return new ArrayList(a);
}

Entity Data Model可能不是那么好

发表于2008年12月21日

Frans Bouma(.NET平台强大的ORM工具-LLBLGen的作者)写了一篇评论微软Entity Framework帖子。微软尝试将其推行为一个比ORM更底层的框架。
而Frans对此进行了批判,按此推理,近十年来许多优秀的ORM工具所实现的解决方案似乎在EF的到来之日都变得毫无价值。但实际上某些很常见的功能却被推到了下一个版本中实现。
当年Ajax红火的时候,微软开始鼓吹自己第一个发明了Ajax核心的XHR机制。而微软的Ajax框架却迟迟不能被复杂应用使用,所谓早期Live版的Hotmail也因为用了微软自己的Ajax而变的难用无比。与GMail对比之下,好多Hotmail忠实用户都无法接受而分分换用GMail。
微软似乎是,在尝试发明(Invention),而不是去创新(Innovention)。如果别人已经有了一些方案,为何不去借鉴学习一下呢?难怪Frans Bouma说,微软需要学习一下如何使用互联网,另外还需要一副近视眼镜。
其实微软也有很多成功的产品,不能其否认其创造性。只是有的时候出于商业目的微软为了推出自己的同类产品,而明示暗示的贬低其他已有产品的价值,这就不好了。从这方面来说制造业的公司(如GE)做的更好更实际一些,发明很重要,创新更重要。毕竟后者才真正产生价值,服务于特定客户的需求,解决其面对的问题,这些才是最重要的。
曾经MSDN Magazine里有一篇介绍TDD的文章,作者大篇幅的介绍了VS中“自动生成测试代码的功能”,但却被一些TDDer狠狠批了一顿。因为TDD的时候生产代码不一定存在呢。这篇文章后来灰溜溜的下了架。