用《叩响C#之门》复习C#基础知识 第五章 枚举、结构体和数组
1、枚舉類型(Enumeration type)
enum 類型名{枚舉項 逗號隔開}?? 是一種數據類型不是變量,如:
enum WeekDays {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}
枚舉類型的定義代碼寫在主函數的外面,和主函數并列放置。
每個枚舉項都關聯一個整數,所以我們可以直接用枚舉項關聯的整數進行賦值,但必須進行顯示轉換。必要時我們也可以將枚舉項賦值給整數變量,也需要進行顯示轉換。如:
WeekDays today = WeekDays.Sunday; today = (WeekDays)6; Console.WriteLine((int)today);//與Console.WriteLine(Convert.ToInt32(today)); 效果一致 Console.WriteLine("Today is "+today); 輸出:
因為每個枚舉項都關聯一個整數,所以枚舉型變量可參與運算和循環。(在過去的學習筆記中發現過這一知識點)
在默認情況下,枚舉項關聯值類型為int型,也可以為枚舉項指定更合適的數據類型。關聯值可以是byte、sbyte、short、ushort、int、uint、long、和ulong等類型。方法是在聲明后加“:其他類型” 如:
enmu WeekDays:short
{
?? Sunday,
?? Monday,
?? Tuesday,
?? Wednesday,
?? Thursday,
?? Friday,
?? Saturday
}
?
枚舉的好處:使用直觀的標識符代替數字,增強了程序的可讀性;每個枚舉項都關聯著一個數字,可以參加計算和循環;枚舉變量只能取枚舉項的值,有利于編譯器檢查出非法的賦值,增加了程序的健壯性。同時由于在編譯階段,編譯器會把枚舉項編譯成對應的整數,系統不會造成性能損失。
?
?
2、結構體
struct Student
{
?? public int number;
?? public string name;
?? public string sex;
?? public string birthday;
}
和枚舉類型一樣,結構體的定義代碼應在主函數之外,其實所有定義類型的代碼都應在主函數之外。
( 結構體補充知識:
struct 類型是一種值類型,通常用來封裝小型相關變量組,例如,矩形的坐標或庫存商品的特征。
結構還可以包含構造函數、常量、字段、方法、屬性、索引器、運算符、事件和嵌套類型,但如果同時需要上述幾種成員,則應當考慮改為使用類作為類型。
結構可以實現接口,但它們無法繼承另一個結構。因此,結構成員無法聲明為 protected。
聲明結構的默認(無參數)構造函數是錯誤的??偸翘峁┠J構造函數以將結構成員初始化為它們的默認值。在結構中初始化實例字段也是錯誤的。
如果使用 new 運算符創建結構對象,則會創建該結構對象,并調用適當的構造函數。與類不同,結構的實例化可以不使用 new 運算符。如果不使用 new,則在初始化所有字段之前,字段都保持未賦值狀態且對象不可用。
對于結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。但是,結構從基類 Object 繼承。結構可實現接口,其方式同類完全一樣。
與 C++ 不同,無法使用 struct 關鍵字聲明類。在 C# 中,類與結構在語義上是不同的。結構是值類型,而類是引用類型。
綜上:當參數類型為int、double等基本類型時,實參和形參之間進行值傳遞,實參和形參占用不同的內存空間,形參的變化不對實參造成影響。)
示例 1
說明
下面的示例演示使用默認構造函數和參數化構造函數的 struct 初始化。
代碼
C#? 復制代碼
public struct CoOrds
{
??? public int x, y;
??? public CoOrds(int p1, int p2)
??? {
??????? x = p1;
??????? y = p2;
??? }
}
C#? 復制代碼
// Declare and initialize struct objects.
class TestCoOrds
{
??? static void Main()
??? {
??????? // Initialize:??
??????? CoOrds coords1 = new CoOrds();
??????? CoOrds coords2 = new CoOrds(10, 10);
??????? // Display results:
??????? System.Console.Write("CoOrds 1: ");
??????? System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
??????? System.Console.Write("CoOrds 2: ");
??????? System.Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
??? }
}
輸出
CoOrds 1: x = 0, y = 0
CoOrds 2: x = 10, y = 10
?
示例 2
說明
下面舉例說明了結構特有的一種功能。它在不使用 new 運算符的情況下創建 CoOrds 對象。如果將 struct 換成 class,程序將不會編譯。 (此情況只針對定義了public的成員變量,其他的還是需要在創建對象后才可,如屬性)
代碼
C#? 復制代碼
public struct CoOrds
{
??? public int x, y;
??? public CoOrds(int p1, int p2)
??? {
??????? x = p1;
??????? y = p2;
??? }
}
C#? 復制代碼
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
??? static void Main()
??? {
??????? // Declare an object:
??????? CoOrds coords1;
??????? // Initialize:
??????? coords1.x = 10;
??????? coords1.y = 20;
??????? // Display results:
??????? System.Console.Write("CoOrds 1: ");
??????? System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
??? }
}
輸出
CoOrds 1: x = 10, y = 20
?
帶屬性和構造函數的 struct 練習
using System; using System.Collections.Generic; namespace Test {public class Program{static void Main(){Student student1=new Student(0001,"TOM","Male");student1.Name = "Mike";Console.WriteLine("{0:####} {1} {2}",student1.Number,student1.Name,student1.Sex);}}public struct Student{private int number;private string name;private string sex;public Student(int numVar,string nameVar,string sexVar){this.number = numVar;this.name = nameVar;this.sex = sexVar;}public int Number{get{return this.number;}set{this.number = value;}}public string Name{get{return this.name;}set{this.name = value;}}public string Sex{get{return this.sex;}set{this.sex = value;}}} }?
?
3、數組
數組多種定義方式(含直接賦值方式):
1)元素類型 [] 數組名;
2)元素類型 [] 數組名={初始值列表};
3)元素類型 [] 數組名=new 元素類型[元素個數];
4)元素類型 [] 數組名=new 元素類型[]{初始值列表};
5)元素類型 [] 數組名=new 元素類型[元素個數]{初始值列表};
如果只做了申明,沒有賦值,如上述的1)和3),賦值如下
對應1) 數組名 = new 元素類型[元素個數];
?????????? 后面再對數組的元素分別賦值,如 數組名[所在位置索引]=值;
???? 或??? 數組名 = new 元素類型[]{初始值列表};
對應3) 直接對數組的元素分別賦值,如 數組名[所在位置索引]=值;
?
foreach循環語句是針對集合的循環語句,數組也可以被看做是個集合,依次從集合里取出元素進行處理。
foreach(元素類型 元素變量 in 數組名)
foreach只能對集合進行讀取操作,不能通過元素變量修改數組中元素的值。不要把此處的元素變量和數組中的元素混為一談。
int[] arrayInt;arrayInt = new int[] { 1,2,3,4,5};foreach(int i in arrayInt){Console.WriteLine(i);}?
?
二維數組
例子:
int[,] matrix1 = new int[3,3]{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };//new int[3,3]可以寫成new int[,]或者不寫 都是可行的
foreach (int arrayLine in matrix)
{
???? Console.WriteLine(arrayLine);
}
?
可變數組
int[][] matrix=new int[3][];
matrix[0] = new int[] { 1, 2 };
matrix[1] = new int[] { 3, 4, 5, 6, 7 };
matrix[2] = new int[] { 8, 9, 10 };
?
可變數組的形式才可以用到雙重foreach循環逐行輸出,普通二維數組想用雙重foreach,必須將形式改為可變數組的形式。
可變數組:
int[][] arrayChange = new int[2][];arrayChange[0] = new int[] { 1, 2, 3 };arrayChange[1] = new int[] { 4, 5, 6, 7 };foreach (int[] line in arrayChange){foreach (int element in line){Console.WriteLine(element);}}普通二維數組:
?
int[][] matrix=new int[3][];matrix[0] = new int[] { 1, 2, 3 };matrix[1] = new int[] { 4, 5, 6 };matrix[2] = new int[] { 7, 8, 9 };foreach (int[] arrayLine in matrix){foreach (int element in arrayLine){Console.Write("{0,-6}", element);}Console.WriteLine();}注意:此處的int[][]雖然與int[,]看上去一樣,int[,] matrix1 = new int[,]{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
但兩者截然不同,不能將matrix1與matrix相互賦值,在普通形式下,是不能用雙重foreach的,也就是說:定義了二維數組后,普通形式下是不認可martix1[0]。這是為什么,存留疑問!
轉載于:https://www.cnblogs.com/365up/archive/2009/10/11/1581036.html
總結
以上是生活随笔為你收集整理的用《叩响C#之门》复习C#基础知识 第五章 枚举、结构体和数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net Membership 回
- 下一篇: VC 命名规则