Chapter 05 變數的更多內容 5.1類型轉換 1.無論什麼類型,所有的數據都是一系列的位,即一組0和1。變數的含義是通過解釋這些數據的方式來傳達的。最簡單的示例是char類型,這種類型用一個數字表示Unicode字元集中的一個字元。實際上,這個數字與ushort的存儲方式相同 他們都是存儲0 ...
Chapter 05 變數的更多內容
5.1類型轉換
1.無論什麼類型,所有的數據都是一系列的位,即一組0和1。變數的含義是通過解釋這些數據的方式來傳達的。最簡單的示例是char類型,這種類型用一個數字表示Unicode字元集中的一個字元。實際上,這個數字與ushort的存儲方式相同----他們都是存儲0~65535之間的數字。
2.一般情況下,不同類型的變數使用不同的模式來表達數據。這意味著,即使可以把一系列的位從一種類型的變數移動到另一種類型的變數中(也許他們占用的存儲空間相同,也許目標類型有足夠的存儲空間包含所有的源數據位),結果也可能與期望的不同。這並不是數據位從一個變數到另一個變數的一對一映射,而是需要對數據進行轉換。
5.1.1 隱式轉換
1.bool和string沒有隱式轉換
2.隱式轉換的規則:任何類型A,只要取值範圍完全包含在類型B的取值範圍內,就可以隱式轉換為類型B。
5.1.2 顯示轉換
1.關鍵字 checked和unchecked
5.1.3 使用convert命令進行顯示轉換
Convert.ToInt32(val)
轉換的名稱略不同於C#類型名稱,例如,要轉換為int,應使用Convert.ToInt32()。這是因為這些命令來自於.net framework的System名稱空間,而不是C#本身。這樣他們就可以在除C#以外的其他.net相容語言中使用。
5.2 複雜的變數類型
5.2.1 枚舉
有時希望變數提取的是一個固定集合中的值,就可以使用枚舉類型。
1.定義枚舉
枚舉可以使用enum關鍵字來定義:
Enum typeName : underluingType
{
values1,
values2,
……
valuesN
}
接著聲明這個新類型的變數:
typeName varName;
並賦值:
varName=typeName.value;
2.枚舉使用一個基本類型(underlying)來存儲。在預設情況下,該類型為int,可以是byte,short,ushort,int,uint,long和ulong。所以枚舉和數組一樣,數據類型只有一種的。
3.在預設情況下,每個只都會根據定義的順序(從0開始),自動賦給對應的基本類型值。這意味著value1的值是0,value2是2......。可以重寫這個賦值過程,使用=運算符。
4.還可以使用一個值作為另一個枚舉的基礎值,為多個枚舉指定相同的值。沒有賦值的任何值都會自動獲得一個初始值,這裡使用的值是比最後一個明確聲明的值大一的序列。
5.把枚舉轉化為其他數據類型?
6.使用typeof(<var>)運算符,可以得到操作數類型。
5.2.2 結構
結構就是由幾個數據組成的數據結構,這些數據可能有不同的類型。
1.定義結構
使用struct關鍵字來定義
struct <typeName>
{
<menberDeclarations>
}
<memberDeclarations>部分包含的變數的定義(成為結構的數據成員),其格式與往常一樣,每個成員的聲明都採用如下的形式:
<accessibility> <type> <name>;
如:
struct myStruct
{
pubilc int x;
pubilc double y;
}
定義了這個結構類型之後,就可以定義新類型的變數,來使用這個結構:
myStruct myStr;
還可以通過句點字元訪問這個組合變數中的數據成員:
myStr.x=2;
myStr.y=2.3;
5.2.3 數組
前面所有的類型都有一個共同點:他們都只存儲一個值(結構中存儲一組值)。有時,需要儲存許多數據,有時需要同時存儲類型相同的幾個值,而不是每個值都使用不同的變數。
數組是一個變數的下標列表,存儲在數組類型的變數中。數組有一個基本類型,數組的各個元素都是這種類型。
1.聲明數組:
<baseType>[] <name>;
其中<baseType>可以是任何變數類型,包括本章前面介紹的枚舉和結構類型。
初始化數組有兩種方式。
1)可以以字面形式指定數組的完整內容。需要提供一個用逗號隔開的元素值列表,該列表放在花括弧中如:
int[] myIntArray={1,4,5,7,9};
2)也可以指定數組的大小,再使用new關鍵字初始化數組元素。需要使用下述語法:
int[] myIntArray= new int[5];
notice:
這裡使用關鍵字new顯示的初始化數組,用一個常量定義其大小。這種方式會給所有的數組元素都賦予同一個預設值,對於數值類型來說,其預設值是0。也可以使用非常量變數來進行初始化,如:
int[] myIntArray=new int [arraySize];
3)另外,還可以使用這兩種初始化方式的組合:
int[] myIntArray=new int[5]{1,3,5,7,9};
使用這種方式,數組的大小必須與元素的個數相匹配。
如果使用變數定義其大小,該變數必須是一個常量,必須用const關鍵字例如:
const int arraySize=5;
int[] myIntArray=new int[arraySize]{1,3,5,7,9};
2.foreach迴圈
foreach(<baseType> <name> in <array>)
{
//can use <name> for each elemet
}
這個迴圈會迭代每個元素,依次把每個元素放在變數<name>中,且不存在訪問非法的危險。使用這種方法和標準的for迴圈的主要區別是foreach迴圈對數組內容進行只讀訪問,所以不能改變任何元素的值。
3.多維數組
1)二位數組的聲明:
<baseType>[,] <name>;
多維數組只需要更多的逗號:
<baseType>[,,,] <name>;
2)聲明和初始化
double[,] hillHeight=new double[3,4];
還可以使用字面值進行初始賦值,這裡使用嵌套的花括弧用逗號隔開,如:
double[,] hillHeight={{1,1,1,},{2,2,2,2},{3,3,3,3}};
4.數組的數組(變長數組)
可以使用變長數組,其中每行都有不同的元素個數。為此,需要這樣一個數組,其中的每個元素都是另一個數組。也可以有數組的數組的數組,或更複雜的數組。但是,註意這些數組必須有相同的基本類型。
1)聲明數組的數組(變長數組),其語法要在數組的聲明中指定多個方括弧對,例如:
int[][] jaggedIntArray;
2)初始化
有兩種方式:可以初始化包含其他數組的數組(稱之子數組)然後依次初始化子數組:
jaggedIntArray=new int[2][];
jaggedIntArray[0]=new int[3];
jaggedIntArray[1]=new int[4];
也可以使用上述字面值賦值的一種改進形式:
jaggedIntArray=new int[3][]{new int[]{1,2,3},new int[]{1},new int[]{1,2}};
也可以簡化,把數組的初始化和聲明放在同一行上,如:
int[][] jaggedIntArray={new int[]{1,2,3},new int[]{1},new int[]{1,2}};
3)使用foreach迭代時,通常需要嵌套該迴圈,迴圈該數組本身和每個子數組。因為數組jaggedIntArray包含的是int[]元素,而不是int元素。
5.3 字元串的處理
1.string類型變數可以看作是char變數的只讀數組,如:
string myString=” A string”;
char myChar=myString[4];
2.但是,不能用這種方式為各個字元變數賦值。為了獲得一個可寫的char數組,可以使用下麵的代碼,其中使用了數組變數的ToCharArray()命令:
string myString=” A string”;
char[] myChars=myString.ToChatArray();
接著就可以用標準方式處理char數組。也可以在foreach迴圈中使用字元串。
3.myString.Length;
4.myString.ToLower(); myString.ToUpper();
5.<string>.Trim()
1)可以使用<string>.Trim()刪除輸入內容前面<string>.TrimStart()的和後面的空格<string>.TrimEnd()。
2)也可以使用該命令刪除指定的字元,只要在一個char數組中指定這些字元即可,如:
char[] trimChars={‘ ‘,’e’,’s’};
string userResponse=Console.ReadLine();
userResponse=userResponse.Trim(trimChars);
if(userResponse==”y”)
{
//act on response.
}
6.<string>.PadLeft()和<string>.PadRight()
1)可以在字元串的左邊或者右邊添加空格
myString=”Aligned”;
myString=myString.PadLeft(10,);
2)也可以添加指定的字元到字元串上,這需要一個char,如:
myString=”Aligned”;
myString=myString.PadLeft(10,’-’); //這將會在myString開頭加上3個’-’。
7.<string>.Split()
1)可以把string轉換為string數組,把它的指定的位置分隔開。這些位置採用char數組的形式。如:
string myString =“This is a test.”
char[] separator={‘ ’};
string[] myWords=myString.Split(separator);
notice:
在使用split()時,刪除了分隔符。