AppleSeeker's Tech Blog
Welcome to AppleSeeker's space
posts - 34,  comments - 314,  trackbacks - 2
在.Net Framework 2.0发布后,泛型就已经深入人心。在CF2.0中也加入了泛型,但大家可知道CF2.0与非精简版中泛型的区别呢?下面将详细叙述,我在.Net CF中使用泛型的几个注意事项。

泛型介绍:
泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。
举例:原先使用集合类型存储数据,数据量大后,装箱拆箱不但影响效率,而且也非安全,毕竟存放进集合的都是Object对象。泛型对象在声明后,即定义好存放的类型,避免装箱拆箱及数据转换。
泛型的使用面很广,有泛型类、泛型接口、泛型方法、泛型委托等。那么多的使用面给开发人员提供了相当大的便捷。

在我的实际应用中,发现.Net CF的泛型不支持2点。
1.不支持泛型递归嵌套
大家可能很奇怪,什么叫泛型递归嵌套。泛型递归嵌套即泛型的对象类型中仍然使用该泛型本身,举例:List<List<int>>。既然泛型允许存放任何类型,那当然应该支持存放一个泛型对象,否则也谈不上泛字吧。在非精简版中,是支持泛型嵌套的,但可惜精简版中不支持。

2.在泛型方法中,最多支持8个泛型参数。
泛型方法中,我们可以约束实际的参数个数,而不必约束对象类型,这样大大提高了可重用性。不必类似以前猛定义Object。精简版中同样不支持。

实际测试如下:
开发平台:VS2008,Windows Mobile 5.0, .Net Compact Framework 2.0

1.在.Net Framework下的代码:
Program.cs
运行结果:

clsA.ClsB实例化时也运行通过。
调用GetInfo2时,传入9个参数,程序照样执行。

2.移动设备下的代码:
private void menuItem4_Click(object sender, EventArgs e)
        
{
            
//MyClass1<int> clsA = new MyClass1<int>();
            
//clsA.clsB.clsB = new MyClass1<MyClass1<MyClass1<int>>>();

            MyClass2
<int> cls2 = new MyClass2<int>();

            MyClass3
<UserInfo> cls3 = new MyClass3<UserInfo>();

            MessageBox.Show(GetInfo
<string>("1""2""3""4"));

            MessageBox.Show(GetInfo1
<string>("1""2""3""4","5","6","7","8","9"));

            MessageBox.Show(GetInfo2
<UserClass1,UserClass2,UserClass3,UserClass4>
                (
new UserClass1(), new UserClass2(), new UserClass3(), new UserClass4()));

            
//MessageBox.Show(GetInfo2<int, string, float, decimal,UserClass1,UserClass2,UserClass3,UserClass4,UserClass5>
            
//    (1, "2", 3.0f, 4.2m, new UserClass1(), new UserClass2(), new UserClass3(), new UserClass4(), new UserClass5()));
        }


        
private string GetInfo<T>(T t1, T t2,T t3, T t4)
        
{
            
return string.Format("info : {0} , {1} ,{2}, {3} ", t1.ToString(), t2.ToString(), t3.ToString(), t4.ToString());
        }


        
private string GetInfo1<T>(T t1, T t2, T t3, T t4,T t5, T t6, T t7, T t8, T t9)
        
{
            
return string.Format("info : {0} , {1} ,{2}, {3}, {4}, {5}, {6}, {7}, {8}", t1.ToString(), t2.ToString(), t3.ToString(), t4.ToString(), t5.ToString(), t6.ToString(),
                t7.ToString(), t8.ToString(), t9.ToString());
        }


        
private string GetInfo2<T1, T2, T3,T4>(T1 t1, T2 t2, T3 t3, T4 t4)
        
{
            
return string.Format("info : {0} , {1} ,{2}, {3} ", t1.ToString(), t2.ToString(), t3.ToString(), t4.ToString());
        }


        
private string GetInfo2<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 t1, T2 t2, T3 t3, T4 t4,T5 t5, T6 t6, T7 t7,T8 t8,T9 t9)
        
{
            
return string.Format("info : {0} , {1} ,{2}, {3}, {4}, {5}, {6}, {7}, {8}", t1.ToString(), t2.ToString(), t3.ToString(), t4.ToString(), t5.ToString(), t6.ToString(),
                t7.ToString(), t8.ToString(), t9.ToString());
        }
注释部分,代码运行不能通过。具体的Demo大家可以下载运行。

原因:
1..NET Compact Framework 在缺少验证工具的情况下不验证正常执行的约束。绑定到泛型参数时,映射仍然会验证约束。
所以编译时不会抱错,但运行时出错。
2..NET Compact Framework 为泛型类型和方法提供了有限的映射功能,因为有限,所以不能支持太强大的使用。但已经可以满足大家的基本需求。

示例Demo下载:GenericDemo.rar

Author: appleseeker
Date: 2008-03-01
Tag标签: Windows Mobile
posted on 2008-03-02 14:37 AppleSeeker 阅读(2016) 评论(7)  编辑 收藏 所属分类: .NetMobile

FeedBack:
2008-03-02 15:03 | fox23      
总觉得泛型和Compact的概念不符..哈哈
曾经听某MSFT说将来的版本一定会有所优化的,暂时还不得而知
  回复  引用  查看    
#2楼 [楼主]
2008-03-02 15:11 | appleseeker      
@fox23
呵呵,那就拭目以待拉,其实泛型有好的地方,目前来说,我觉得对于CF来说,还是不错的
  回复  引用  查看    
2008-03-03 09:53 | micYng      
泛型递归嵌套

记得之前看过某本书中说到,M$不推荐这样使用,但经常也在m$官方给出的某某demo有这样的用法,反正我个人是不忌讳啦,o(∩_∩)o...哈哈

不过CF框架不支持这样,倒是有点麻烦了
  回复  引用  查看    
#4楼 [楼主]
2008-03-03 11:21 | appleseeker      
@micYng
恩,因为TypeLoad对于CF来说,性能上肯定大大折扣的。不能要求支持太强大的嘛,能用就行,但是对编译时不能指出,这到是值得改进的地方。
  回复  引用  查看    
2008-03-03 17:04 | Annie      
为什么打不开示例呢?
  回复  引用  查看    
#6楼 [楼主]
2008-03-03 21:19 | appleseeker      
@Annie
下载下来的RAR能解压吗?不可以的话,可能RAR版本比较老了。
如果可以解压,打不开工程的话,安装VS2008。
  回复  引用  查看    
#7楼 [TrackBack]
2008-03-05 18:12 | fox23
前面文章的描述中已经提到了资源有限的移动设备应用的性能问题要比桌面程序更为棘手。对于托管的应用程序,CLR使你的应用程序从与OS直接耦合的状态中解放出来。然而CLR却常常因为程序员不恰当的编码方式而变得“烦躁”,从而导致JIT的代码膨胀以及程序性能的下降。本文主要阐述了在移动设备上CLR与程序性能有哪些密切联系,以及应当以何种方式编码以使.NET CF CLR的运行更加smooth。
[引用提示]fox23引用了该文章, 地址: http://www.cnblogs.com/fox23/archive/2008/03/05/wmadv3.html
  回复  引用  查看    
AppleSeeker
MSN:appleseeker@hotmail.com
Mail:appleseeker@gmail.com

feedsky
google reader
bloglines
newsgator
netvibes
鲜果
哪吒
有道
抓虾
Rojo
my yahoo

<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

与我互动

常用链接

留言簿(4)

我参与的团队

我的标签

随笔分类(55)

随笔档案(34)

Mobile Blog

最新随笔

搜索

  •  

积分与排名

  • 积分 - 72971
  • 排名 - 467

最新评论

  • 1. re: Windows Mobile 5.0 (2)
  • @zhangyi85
    @张谊
    不好意思,今天上午看到后,写了篇文章,你可以参考下。
  • --AppleSeeker
  • 2. re: Windows Mobile 5.0 (2)
  • 请问如何才能在本机上用模拟器来访问的到呢?我做好了一个移动的web页面,也发布并挂到了IIS下面了,用IE浏览器测试可以访问,但是打开模拟器,用模拟器里面的IE来访问,就总提示访问不到,但是用模拟器里...
  • --张谊
  • 3. re: Windows Mobile 5.0 (2)
  • 请问如何才能在本机上用模拟器来访问的到呢?我做好了一个移动的web页面,也发布并挂到了IIS下面了,用IE浏览器测试可以访问,但是打开模拟器,用模拟器里面的IE来访问,就总提示访问不到,但是用模拟器里...
  • --zhangyi85
  • 4. re: .Net Compact Framework 高级篇(1)

  • 非常感谢!
  • --charlie2008
  • 5. re: Windows Mobile 5.0 (1)
  • 我就是按照你的安装顺序,可是要生成.cab时,在新建项目-》其他项目类型—》安装和部署-》智能设备cab项目,然后右键program file,选择添加-》项目输出,在弹出的窗口里的 项目 里,下...
  • --Backylee

阅读排行榜

评论排行榜

60天内阅读排行