程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .Net Compact Framework泛型使用的注意點

.Net Compact Framework泛型使用的注意點

編輯:關於.NET

在.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

 1using System;
  2using System.Collections.Generic;
  3using System.Linq;
  4using System.Text;
  5
  6namespace ConsoleGenericApp
  7{
  8    class Program
  9    {
10        static void Main(string[] args)
11        {
12            MyClass1<int> clsA = new MyClass1<int>();
13            clsA.clsB = new MyClass1<MyClass1<int>>();
14
15            MyClass2<int> cls2 = new MyClass2<int>();
16
17            MyClass3<UserInfo> cls3 = new MyClass3<UserInfo> ();
18
19            System.Console.WriteLine(GetInfo<string>("1", "2", "3", "4"));
20
21            System.Console.WriteLine(GetInfo1<string>("1", "2", "3", "4", "5", "6", "7", "8", "9"));
22
23            System.Console.WriteLine(GetInfo2<UserClass1, UserClass2, UserClass3, UserClass4>
24                (new UserClass1(), new UserClass2(), new UserClass3(), new UserClass4()));
25
26            System.Console.WriteLine(GetInfo2<int, string, float, decimal, UserClass1, UserClass2, UserClass3, UserClass4, UserClass5>
27                (1, "2", 3.0f, 4.2m, new UserClass1(), new UserClass2(), new UserClass3(), new UserClass4(), new UserClass5()));
28
29            System.Console.ReadLine();
30        }
31        private static string GetInfo<T>(T t1, T t2, T t3, T t4)
32        {
33            return string.Format("info : {0} , {1} ,{2}, {3} ", t1.ToString (), t2.ToString(), t3.ToString(), t4.ToString());
34        }
35
36        private static string GetInfo1<T>(T t1, T t2, T t3, T t4, T t5, T t6, T t7, T t8, T t9)
37        {
38            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(),
39                t7.ToString(), t8.ToString(), t9.ToString());
40        }
41
42        private static string GetInfo2<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4)
43        {
44            return string.Format("info : {0} , {1} ,{2}, {3} ", t1.ToString (), t2.ToString(), t3.ToString(), t4.ToString());
45        }
46
47        private static 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)
48        {
49            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(),
50                t7.ToString(), t8.ToString(), t9.ToString());
51        }
52    }
53}

運行結果:

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 為泛型類型和方法提供了有限的映射功能,因為有限,所以不能支持太強 大的使用。但已經可以滿足大家的基本需求。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved