在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天微软的一个Developer给我们做了三个讲座,其中谈到了C# 2.0中的新特性。因为我对C++中的Generic Programming比较熟,因此在他讲的时候就想到了几个问题。
template <class _Key, class _Compare = less<_Key>,
class _Alloc = allocator<_Key> > class set;
C# 2.0中要想提供这样的便利,至于要支持两个特性:模板参数默认值和previous模板参数的引用。不同于方法参数的默认值,模板参数的默认值,尤其是基于previous参数的默认值,是很难模拟的。
public class GenericTest<T>
; 如果在Client调用NormalTest.Foo(1),输出会为"two",也就是说,C# 2.0优先选择more specialized的重载,只有所有Specialized的重载都不符合后,才会使用Generic的版本。注意这种Overload的Resolve是不考虑modifier的保护级别的,如果将NormalTest.Foo(int)的public变成private,调用NormalTest.Foo(1)的代码在编译时就会发生一个错误,编译器认为从类外调用了一个private的方法。 对于GenericTest的情况,如果从其某一个静态方法内调用Foo(1),我想应该是Foo(int)这个方法被调用,但如果在类外以GenericTest<int>.Foo(1)的方式调用,我还不清楚是输出"one", "two"还是编译出错。因为我现在的机器没有装.NET 2.0 beta,所以无法验证,有装.NET 2.0 beta的可以试一下。还有,调用NormalTest.Foo<int>(1)时会有什么输出,也需要验证。单纯的猜测是靠不住的。 因为C# 2.0中提供了Partial Type,因此在多个文件中提供类中某一个Generic Method的specialized版本,应当是比较有效的。总体感觉C# 2.0实现的Generic虽然有限,但也算得上是一个完备的功能集,用起来还是很方便的。 很久以前看到C# 2.0的一些介绍,已经好久没有关注了,只因为今天的讲座想起了这些,欢迎大家与我讨论交流。 |
请发表评论