2018年7月27日 星期五

泛型(GenericClass)傳接值說明

簡單介紹泛型(GenericClass)並實作一個範例
簡單介紹泛型(GenericClass)並實作一個範例

之前在和同事聊天時他有提到說LIST 是用泛型做的
說實在我用List 那麼久了都不知道他的實作基礎泛型是啥東西故上網研究一下
就我個人的觀點來看泛型 的最大特徵就是將傳入 , 傳出的變數型態給變數化
通常我們在撰寫Function 時都要定義輸入輸出的變數型態 當類似的程式邏輯但是要傳入傳出不同的參數型態時就要宣告一大堆定義Function 用泛型的話就可以解決上述的問題

使用方式
程式組成有兩個程式檔案
GenericClass.cs          => 範例程式
GenericClass_Test.cs      => 執行的Unit Test

   GenericClass.cs 程式碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GenericClass
{
    class MyGenericClass
    {
        private object aInstance; 
       // 以實體物件儲放樣版物件,測試樣版物件與實體物件的互通性。
        public void SetInstance<T>(T t)
        {
            aInstance = t; // 以實體儲放樣版。
        }
        //太重要了
        public T GetInstance<T>()
        {
            return (T)aInstance; // 自實體物件取回樣版物件。
        }


        public void Dump()
        {
            if (aInstance == null)
            {
                Console.WriteLine("aInstance is null.");
                return;
            }

            Type tp = aInstance.GetType();
            string dumpInfo = string.Format("MyTClass.Dump -> Type: {0}, ToString: {1}", tp.Name, aInstance.ToString());
            Console.WriteLine(dumpInfo);
        }
    }
}

   GenericClass_Test.cs程式碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using NUnit.Framework;
using Ionic.Zip;
using ObjectConverter.Tool;
using System.Data;
using GenericClass;

namespace ObjectConverter_Test
{
    [TestFixture]
    public class GenericClass_Test
    {
        [Test]
        public void ObjectConverter_Tool_Test()
        {
            //## C#泛型函式測試
            Console.WriteLine("## C#泛型函式測試");
            Show<int>(1);
            Show<string>("string1");

            //## 泛型類別傳遞參數測試
            Console.WriteLine("\r\n## 泛型類別傳遞參數測試");
            MyGenericClass tc = new MyGenericClass();

            tc.SetInstance<int>(3); // 以泛型傳入INT32
            tc.Dump();
            int ii = tc.GetInstance<int>(); // 以泛型取回INT32
            Console.WriteLine(ii);

            tc.SetInstance<string>("str3."); // 以泛型傳入String
            tc.Dump();
            string ss = tc.GetInstance<string>(); // 以泛型取回String
            Console.WriteLine(ss);

        }

        static void Show<T>(T t)
        {
            Console.Write("Show<T> -> ");
            Type tp = t.GetType();
            string info = string.Format("{0}, {1}", tp.Name, t.ToString());
            Console.WriteLine(info);
        }
    }
}

呈現結果
------ Test started: Assembly: GenericClassProject.dll ------

## C#泛型函式測試
Show<T> -> Int32, 1
Show<T> -> String, string1

## 泛型類別傳遞參數測試
MyTClass.Dump -> Type: Int32, ToString: 3
3
MyTClass.Dump -> Type: String, ToString: str3.
str3.

1 passed, 0 failed, 0 skipped, took 5.65 seconds (NUnit 2.5.5).

程式細部說明
下面將針對比較重要的程式碼部分做出說明

## C#泛型函式測試
上面的程式碼簡單的描述泛型是如何使用並且如何取得泛型的傳入傳出的變數型態

## 泛型類別傳遞參數測試
上面的程式碼簡單的說明如何使用泛型建立MyGenericClass
並使用該Class存取不同變數型態的變數

取自

沒有留言:

張貼留言