1、2022/11/14程式設計(二)C#programming1第3章:Visual C#2008資料型別林佩蓉 老師 弘光科技大學資訊工程學系九十七學年度第二學期2022/11/14程式設計(二)C#programming2本章大綱l3-1:共通型別系統(Common Type System)介紹l3-2:變數(Variable)與常數(Constant)介紹l3-3:Visual C#2008關鍵字l3-4:Visual C#2008運算子l3-5:is和as運算子l3-6:資料型別種類(Data types class)l3-7:var匿名型別(Anonymous Types)l3-8:e
2、num、struct、Nullable資料型別介紹l3-9:資料型別的轉換方法2022/11/14程式設計(二)C#programming33-1:共通型別系統(Common Type System)介紹l3-1-1:CLR、CTS與CLS三者關係l3-1-2:實值型別與參考型別(Value Type&Reference Type)l3-1-3:裝箱與拆箱(Boxing&Unboxing)l3-1-4:隱含轉換&明確轉換(Implicit conversion&Explicit conversion)2022/11/14程式設計(二)C#programming43-1-1:CLR、CTS與CL
3、S三者關係l共通語言執行時期環境(Common Language Runtime,CLR)是.NET Framework中最基本的部份,包含程式碼的編譯安全性的控管等。l共通型別系統(Common Type System,CTS)是被用於.NET Framework上所使用的每一種語言。l共通語言規格(Common Language Specification,CLS)是用來描述不同語言(包含:VB,C#C+等)的共同特色。CLS用CTS來定義語言的資料型別:lIntergerVB /int C#(System.Int32型別)2022/11/14程式設計(二)C#programming53-
4、1-2:實值型別與參考型別l實值型別(Value Type):宣告實值型別的變數會儲存資料。指派一個實值型別變數給其他實值型別變數,會複製所包含的值,常見C#實值型別如:byte、int、double、bool、char等等。l參考型別(Reference Type):宣告參考型別的變數是儲存實際資料的參考。參考型別變數的指派會複製物件的參考,但不會複製物件本身。C#常見的參考型別如:類別、介面、字串、陣列、委派、指標等等。2022/11/14程式設計(二)C#programming6l3-1-2:實值型別與參考型別l在執行.NET的程式時,對於不同型別,CLR(Common Language
5、 Runtime)會在不同的地方分配資源空間。對於實值型別(Value Type),當宣告一個變數時,CLR會在Stack(堆疊)中配置一塊空間,設定該變數的值時,其值也直接存放於該空間中,如右圖:l而對於參考型別(Reference Type),CLR則在Stack中配置一塊存放記憶體位址的空間,在初始化該型別的實體時(ex:new),則在Heap(堆積)上配置該型別所需的空間,再將該空間的位址傳回給存放在Stack中的那塊空間,如下圖:l這些由CLR自動配置與管理的記憶體,被稱為Managed資源;反之,不受CLR管理的便被稱為Unmanaged資源(ex:Stream、與資料庫的連結、C
6、OM物件等)。2022/11/14程式設計(二)C#programming73-1-2:實值型別與參考型別lStack記憶體:lStack記憶體通常用來存放方法內所宣告的區域變數或參數,當方法執行完畢後,會自動從Stack中被釋放(移除)。lHeap記憶體:lHeap記憶體通常用來存放方法內所宣告的物件,也就是當您使用new關鍵字將類別實體化為物件時,該物件的參考記憶體位置會存放在Stack,而物件本身會存放在Heap記憶體,二個不同的變數能夠參考相同的物件。2022/11/14程式設計(二)C#programming8實值型別 P3-5l如果建立兩個實值型別的變數 i 和 j(如下所示),那
7、麼 i 和 j 彼此之間完全無關聯:lint i=10;int j=20;它們的記憶體位置並不相同:如果變更其中一個變數的值,另一個變數當然不會受到影響。2022/11/14程式設計(二)C#programming9參考型別 P3-6lEmployee ee1=new Employee();lEmployee ee2=ee1;l現在,由於在 C#中類別是參考型別,因此 ee1 也稱為 Employee 的參考。上述兩行程式碼中的第一行會在記憶體中建立 Employee 的執行個體,並且將 ee1 設定為參考這個執行個體。當您將 ee2 設為等於 ee1 時,它會包含記憶體中這個類別參考的複本。
8、此時如果變更 ee2 上的屬性,ee1 上的屬性將會反映這些變更,這是因為這兩個都指向記憶體中的同一個物件,如下所示:2022/11/14程式設計(二)C#programming103-1-3:裝箱與拆箱(Boxing&Unboxing)l裝箱(Boxing):將實值型別 轉換成 參考型別的過程l拆箱(Unboxing):將參考型別 轉換成 實值型別的過程2022/11/14程式設計(二)C#programming113-1-4:隱含轉換&明確轉換 (Implicit conversion&Explicit conversion)ch03ImplicitExplicitConversionl隱
9、含轉換就是將值域範圍較小的資料型別轉換成值域範圍較大的資料型別,由於此種轉換方式是由系統自動處理,故又稱自動轉換,並且在轉型之後資料不會因此而失真。(小大)P3-322022/11/14程式設計(二)C#programming123-1-4:隱含轉換&明確3-1-4:隱含轉換&明確轉換 (Implicit conversion&Explicit conversion)ch03ImplicitExplicitConversionl明確轉換就是將值域範圍較大的資料型別強制轉換成值域範圍較小的資料型別,又稱為強制轉換,在轉型之後資料通常會有失真的問題。(大小)lCast:無條件捨去lConvert:
10、四捨五入2022/11/14程式設計(二)C#programming133-2:變數(Variable)與常數(Constant)介紹l3-2-1:變數(Variable)l3-2-2:常數(Constant)l3-2-3:變數與常數命名技巧2022/11/14程式設計(二)C#programming143-2-1:變數(Variable)P3-9P3-10l變數(Variable)是指程式中資料最基本的儲存單位,是記憶體中用來存放資料的一塊儲存區域。l實體化變數(Instance Variables)l類別變數(Class Variables)l區域變數(Local Variables)l參
11、數變數(Parameters)l變數的宣告方式存取修飾詞資料型別變數名稱;public int 依C#命名規則 private long protected float internal char2022/11/14程式設計(二)C#programming15成員的存取限制lpublic:公用成員,所有其它(非此類別)的函式或類別皆可以存取此成員。lprivate:私有成員,所有其它(非此類別)的函式或類別皆不可以存取此成員。lprotected:保護成員,所有其它(非此類別)的函式或類別皆不可以存取此成員,但繼承此類別的類別(子類別)可以存取此成員。2022/11/14程式設計(二)C#pr
12、ogramming163-2-1:變數(Variable)ch03Variable_ex類別變數區域變數參數變數2022/11/14程式設計(二)C#programming173-2-2:常數(Constant)ch03Constant_exl常數(Constant)是指用來存放固定不變的數值,常見的典型範例就是圓周率為3.14此值是不會變動的,這種永遠不會變動的值就可以宣告成常數來使用,其他常見的例子有性別、血型、星座、生肖、出生年月日等,這些資訊對於個人而言都是固定不會變動的。存取修飾詞 const 資料型別變數名稱 =預設值;public const double PI =3.14;20
13、22/11/14程式設計(二)C#programming183-2-2:常數(Constant)ch03Constant_ex2022/11/14程式設計(二)C#programming193-2-3:變數與常數命名技巧l常用的命名法有以下兩種:l巴斯卡(Pascal)命名法l駱駝(Camel)命名法2022/11/14程式設計(二)C#programming203-3:Visual C#2008關鍵字l關鍵字(Keyword)就是對編譯器具有特殊意義的文字所組成的保留識別項,這些保留識別項不能當成變數(Variable)來使用,主要是留給程式語言指令所使用,故又稱保留字(Reserved W
14、ord)。l內容關鍵字(Contextual Keywords)是指在特定的程式內容才具有特殊意義,例如:宣告LINQ語言。2022/11/14程式設計(二)C#programming213-4:Visual C#2008運算子l3-4-1:運算子優先順序和結合性l3-4-2:一元運算子(Unary operators)l3-4-3:算術運算子(Arithmetic operators)l3-4-4:串連運算子(Concatenation operators)l3-4-5:關係運算子(Relational operators)l3-4-6:邏輯運算子(Logical operators)l3-
15、4-7:指定運算子(Assignment operators)2022/11/14程式設計(二)C#programming223-5:is和as運算子 ch03IsOperators_exl3-5-1:is lis運算子用來檢查物件(變數)是否屬於某資料型別。2022/11/14程式設計(二)C#programming233-5:is和as運算子 ch03AsOperators_exl3-5-2:as運算子las 運算子主要用來執行相容參考型別之間的轉換,as 運算子作用如同轉型作業。P6-23P6-26P4-20P3-242022/11/14程式設計(二)C#programming243-6
16、:資料型別種類(Data types class)l在Visual C#2008資料型別的分類有二種:一、內建資料型別,二、使用者定義資料型別。l內建資料型別部分最常見的有int、string、bool、char、double等。l使用者定義資料型別部分常見的就是interface或class。2022/11/14程式設計(二)C#programming253-7:var匿名型別(Anonymous Types)lvar主要作用有二:l 作為隱含型別(Implicitly Typed)用來推斷(Inferred)區域變數或陣列的型別,透過var關鍵字來指示編譯器判斷初始化陳述句右邊的運算式,推
17、斷變數或陣列項目的資料型別。l 作為匿名型別(Anonymous Types)用來提供簡便的方式不用明確定義型別就能將唯讀屬性集封裝到單一物件,也就是在使用new實體化時不用指明類別名稱。2022/11/14程式設計(二)C#programming263-7:var匿名型別(Anonymous Types)ch03var_ex2022/11/14程式設計(二)C#programming273-8:enum、struct、Nullable資料型別介紹l3-8-1:列舉(enum)資料型別l3-8-2:結構(struct)資料型別l3-8-3:Nullable類別2022/11/14程式設計(二)
18、C#programming283-8-1:列舉(enum)資料型別 ch03Enum_exlenum是一種用來宣告列舉型別(Enumeration Type)的關鍵字,是一組列舉清單項目的具名常數所構成的特殊型別,enum主要作用在於提高程式的可讀性與易維護性。l當列舉宣告完成時,只要輸入SuperStar.就會自動帶出其相關成員參數供選用。存取修飾詞 enum 列舉名稱:資料型別 成員 1,成員 2,成員 n2022/11/14程式設計(二)C#programming292022/11/14程式設計(二)C#programming303-8-2:結構(struct)資料型別 ch03Stru
19、ct_exlstruct是一種用來宣告結構的關鍵字,在結構中包含相關變數,可將結構視為變數群組。以書籍(Book)來說,若要設計其結構,他可能包含幾個相關變數,如:書籍名稱(BookName)、作者(Author)、出版日期(PublishDate)、價格(Cost)等。l宣告方式:l叫用方式:存取修飾詞 struct 結構名稱 存取修飾詞 資料型別 變數名稱 ;存取修飾詞 資料型別 變數名稱 ;.結構名稱 變數名稱;2022/11/14程式設計(二)C#programming31叫用方式宣告方式2022/11/14程式設計(二)C#programming323-8-3:Nullable類別
20、ch03Nullable_exlNullable類別是.NET Framework 2.0版之後所提供的功能,其功能在於用來支援實值型別存放null值,此null值相當於Visual Basic 2008的Nothing,所以Nullable類別的作用就是讓實值型別變數可以存放虛值(null)。l在實務上常用null來表示”未知的值”,表示暫未存放內容,在未宣告成Nullable之前不能存放null值。2022/11/14程式設計(二)C#programming333-8-3:Nullable類別 ch03Nullable_exNullabledouble?2022/11/14程式設計(二)C
21、#programming343-9:資料型別的轉換方法l3-9-1:System.Convert轉換 P3-32l3-9-2:型別.Parse方法 P3-33l3-9-3:指定轉換(Cast)P3-342022/11/14程式設計(二)C#programming353-9:資料型別的轉換方法(System.Convert)ch03SystemConvert_exlSystem.Convert類別主要作用在於將基底資料型別轉換為其他的型別資料。2022/11/14程式設計(二)C#programming36lParse()方法主要將指定字串的內容轉換成指定的型別資料,處理對象是字串(String
22、)。3-9:資料型別的轉換方法(型別.Parse方法)ch03Parse_exP3-33txtDateInput.Text2022/11/14程式設計(二)C#programming373-9-3:指定轉換(Cast)ch03Case_exl指定轉換(Cast)就是將資料型別強制轉換成指定的資料型別,此種轉換的能力最為強大,我們稱這種強制轉換的方式又稱為鑄型(Cast)。l使用Cast最常犯的錯誤就是轉換的內容為字串型態。2022/11/14程式設計(二)C#programming38Homework IlDeadline:2009/03/12l作業共五題,請參考投影片P.36P.41說明l壓
23、縮整個方案目錄(U99B999-HW1)上傳至http:/140.134.25.432022/11/14程式設計(二)C#programming39Solution for HW1(1 Solution,5 projects)l1.以自己的學號為名建立一個方案.ex.U99B999-HW1l2.在方案中分別建立5個專案:lU99B999-HW1-1(Console)lU99B999-HW1-2(Console)lU99B999-HW1-3(Console)lU99B999-HW1-4(Windows Form)lU99B999-HW1-5(Windows Form)2022/11/14程式設計
24、(二)C#programming40U99B999-HW1-1(Console)l在U99B999-HW1中建立一個專案命名為U99B999-HW1-1l由鍵盤輸入年度所得(income),依下列税率計算應繳稅額:l若income 100萬元,税率15%l若100萬元=income =200萬,稅率40%2022/11/14程式設計(二)C#programming41U99B999-HW1-2(Console)l在U99B999-HW1中建立一個專案命名為U99B999-HW1-2l由鍵盤輸入四個字元的密碼,密碼為”ymca”,若輸入的密碼正確,則顯示”login成功,歡迎進入本系統”,再離開
25、for迴圈;若密碼錯誤,最多允許連續輸入三次,若三次都錯誤,則顯示”密碼錯誤,無法進入!”2022/11/14程式設計(二)C#programming42U99B999-HW1-3(Console)l在U99B999-HW1中建立一個專案命名為U99B999-HW1-3l由鍵盤依序輸入二個數值運算元以及一個算術運算子(+,-,*,/)之一,再由電腦計算出其計算結果l提示:請用switch case判別2022/11/14程式設計(二)C#programming43U99B999-HW1-4(Windows Form)l利用enum陳述句設計一個作業系統(OperatingSystem)的列舉,
26、其成員為:WindowsVista,DOS,Linux,Solaris,OS2以及Macintosh等六種經典作業系統。並且提供使用者輸入整數數字1-6,來選擇所喜愛的作業系統,當輸入數值範圍不在1-6之間時則顯示”數值不在列舉值範圍”,執行結果請見下圖。l提示:請參考 Enum_ex範例(P3-26P3-28)2022/11/14程式設計(二)C#programming44U99B999-HW1-5(Windows Form)l請利用sturct結構設計一個學生(Sudent)個人資料結構,其結構內變數成員,包括:學號(StdID)-文字型態,姓名(Name)-文字型態,性別(Sex)-布林型態,計概(Computer)-倍精浮點數並且可存放null值 練習練習Nullablel提示:請參考 Nullable_ex範例(P3-30P3-31)2022/11/14程式設計(二)C#programming45Any Questions?