看陳廣老師c#參考視頻總結(第三篇)

日期:2008-6-8
學習內容:泛型,裝箱和拆箱,C#中的數據類型,C#中的字符
遺留問題:
學習總結:
1.       泛型的引入
using System;

namespace ConsoleApplication3

{

    class Stack

    {

        private int[] items;//定義一個數組用於存儲在棧中的值

        private int count;//定義一個變量存儲棧中元素的個數

        public Stack(int size)//帶參數的構造函數,初始化棧

        {

            items = new int[size];//給數組元素指定大小

            count = 0;

        }

        public void Push(int x)//成員方法,入棧

        {

            items[count++] = x;

        }

        public int Pop()//成員方法,出棧

        {

            return items[--count];

        }

    }

    class Test

    {

        static void Main(string[] args)

        {

            Stack s = new Stack(10);//聲明一個Stack類的實例,棧的大小爲10個元素

            s.Push(111);//調用Push方法將數據壓入棧中

            s.Push(222);

            Console.WriteLine(s.Pop()+s.Pop());//調用Pop方法,是棧中的元素出棧,並使出棧的元素相加

        }

    }

}

如果用戶的需求發生改變了,既想輸入整數的值又想輸入其他類型的數值該怎麼辦呢?第一種方法:繼續重載第二種方法:引用object類 第三種方法:泛型

第二中方法的例子:

using System;

namespace ConsoleApplication3

{

    class Stack

    {

        private object[] items;//定義一個數組用於存儲在棧中的值

        private int count;//定義一個變量存儲棧中元素的個數

        public Stack(int size)//帶參數的構造函數,初始化棧

        {

            items = new object[size];//給數組元素指定大小

            count = 0;

        }

        public void Push(object x)//成員方法,入棧

        {

            items[count++] = x;

        }

        public object Pop()//成員方法,出棧

        {

            return items[--count];

        }

    }

    class Test

    {

        static void Main(string[] args)

        {

            Stack s = new Stack(10);//聲明一個Stack類的實例,棧的大小爲10個元素

            s.Push(123);//調用Push方法將數據壓入棧中

            s.Push(456);

            Console.WriteLine((int)s.Pop() +(int)s.Pop());//調用Pop方法,是棧中的元素出棧,並使出棧的元素相加

        }

    }

}

問題:如果用戶先輸入一個整型數,再輸入一個浮點型的數,編譯能通過,但運行時出現system.invalicastexcption異常,隱藏的缺陷,不容易發現錯誤。且在程序中出現了大量的裝箱和拆箱操作,程序的性能下降

第三種方法的例子:

using System;

namespace ConsoleApplication3

{

    class Stack<T>

    {

        private T[] items;//定義一個數組用於存儲在棧中的值

        private int count;//定義一個變量存儲棧中元素的個數

        public Stack(int size)//帶參數的構造函數,初始化棧

        {

            items = new T[size];//給數組元素指定大小

            count = 0;

        }

        public void Push(T x)//成員方法,入棧

        {

            items[count++] = x;

        }

        public T Pop()//成員方法,出棧

        {

            return items[--count];

        }

    }

    class Test

    {

        static void Main(string[] args)

        {

            Stack<string> s = new Stack<string>(10);//聲明一個Stack類的實例,棧的大小爲10個元素

            s.Push("123");//調用Push方法將數據壓入棧中

            s.Push("445");

            Console.WriteLine(s.Pop() +s.Pop());//調用Pop方法,是棧中的元素出棧,並使出棧的元素相加

        }

    }

}

泛型的引用:大大減少了裝箱和拆箱的操作,提高了程序的性能

查看是否進行了裝箱和拆箱操作的方法:打開MIL 反彙編程序,打開編譯後生成的.exe文件,即可查看

2.       裝箱和拆箱
只有被裝了箱的值類型,才能進行拆箱操作

3.       C#中的數據類型
C#中有兩種類型:值類型和引用類型。值類型的變量直接包含它們中的數據,而引用類型的變量存儲的是對它們數據的引用(即指向對象的指針),後者稱爲對象。
上圖展示了C#中類型的組織結構,object類是各種類型的基類
引用類型在內存的託管堆中(包括同步塊和方法表),值類型的對象分配在內存的堆棧中
using System;

namespace ConsoleApplication4

{

    class Myclass

    {

        public int i;

    }

    class Test

    {

        static void Main(string[] args)

        {

            Myclass mc = new Myclass();

            mc.i = 100;

            Myclass mc1 = mc;

            mc1.i = 200;

            Console.WriteLine("mc.i="+mc.i);

            Console.WriteLine("mc1.i="+mc1.i);

 

        }

    }

}

//輸出結果mc.i=200,mc1.i=200

注意:mcmc1指向的是同一塊託管堆

using System;

namespace ConsoleApplication4

{

    struct Myclass

    {

        public int i;

    }

    class Test

    {

        static void Main(string[] args)

        {

            Myclass mc = new Myclass();

            mc.i = 100;

            Myclass mc1 = mc;//拷貝的是mc的副本

            mc1.i = 200;

            Console.WriteLine("mc.i="+mc.i);

            Console.WriteLine("mc1.i="+mc1.i);

 

        }

    }

}

//輸出結果mc.i=100,mc1.i=200

注意:值類型各有個的塊

using System;

namespace ConsoleApplication4

{

    class Myclass

    {

        public int i;

    }

    class Test

    {

        static void Seti(Myclass m)

        {

            m.i = 300;

        }

        static void Main(string[] args)

        {

            Myclass mc = new Myclass();

            mc.i = 100;//在託管堆中分配存儲空間存儲100的值,在堆棧中存儲的是指向100的地址

            Myclass mc1 = mc;//mc中的地址賦給mc1,讓他也指向100

            Seti(mc1);//調用構造方法,讓對象m也指向100,並修改他的值爲300

            Console.WriteLine("mc.i="+mc.i);

            Console.WriteLine("mc1.i="+mc1.i);

 

        }

    }

}

//輸出的結果爲:mc.i=300,mc1.i=300

using System;

namespace ConsoleApplication4

{

    struct Myclass

    {

        public int i;

    }

    class Test

    {

        static void Seti(Myclass m)

        {

            m.i = 300;

        }

        static void Main(string[] args)

        {

            Myclass mc = new Myclass();

            mc.i = 100;//在堆棧中存儲100的值

            Myclass mc1 = mc;//創建100的副本給mc1

            Seti(mc1);//創建100的副本給m,修改的是m中的i

            Console.WriteLine("mc.i="+mc.i);

            Console.WriteLine("mc1.i="+mc1.i);

 

        }

    }

}

//輸出的結果爲:mc.i=100,mc1.i=100

值類型的使用場合:

當類型是一個十分簡單的類型,其中沒有成員會修改類型的任何實例字段

類型不需要從任何其他類型繼承

類型不會派生出任何其他類型

類型的實例較小

類型不作爲方法參數傳遞,也不作爲方法的返回類型使用

4.      C#中的字符

.net framework中,字符總表示成16位的Unicode代碼值,這簡化了全球引用程序的開發。一個字符表示成System.char結構(一個值類型)的一個實例

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            string s;

            s = textBox1.Text;

            foreach (char c in s)

            {

                int i = (int)c;//將漢字強制轉換爲整型

                if (i < 0x4e00 || i > 0x9fa5)//漢字的十六進制的取值範圍爲0x9fa5-0x4e00

                    MessageBox.Show("用戶名輸入有誤!");

            }

        }

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章