亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

<展現C#> 第四章 C#類型

2019-11-18 22:07:07
字體:
來源:轉載
供稿:網友

                                 第四章  C#類型

    既然你知道了怎樣創建一個簡單的C#程序,我將會給你介紹C#的類型系統。在這一章中,你學到如何使用不同的值和引用類型,加框和消框機制能為你作些什么。盡管這一章的不側重于例子,但你可以學到很多重要的信息,關于如何創建現成類型的程序。
4.1 值類型
    各種值類型總是含有相應該類型的一個值。C#迫使你初始化變量才能使用它們進行計算-變量沒有初始化不會出問題,因為當你企圖使用它們時,編譯器會告訴你。    
每當把一個值賦給一個值類型時,該值實際上被拷貝了。相比,對于引用類型,僅是引用被拷貝了,而實際的值仍然保留在相同的內存位置,但現在有兩個對象指向了它(引用它)。C#的值類
型可以歸類如下:
·簡單類型(Simple types )
·結構類型(struct types)
·枚舉類型(Enumeration types)
4.1.1  簡單類型
    在C#中出現的簡單類型共享一些特性。第一,它們都是.NET系統類型的別名。第二,由簡單類型組成的常量表達式僅
在編譯時而不是運行時受檢測。最后,簡單類型可以按字面被初始化。以下為C#簡單類型歸類:
·整型
·布爾型
· 字符型 (整型的一種特殊情況)
·浮點型
·小數型

4.1.1.1  整型
    C#中有9個整型。 sbyte 、byte、 short、 ushort、 int、 uint、 long、 ulong 和 char(單獨一節討論)。它們
具有以下特性:

·sbyte型為有符號8位整數,取值范圍在128~127之間。     
·bytet型為無符號16位整數,取值范圍在0~255之間。
·short型為有符號16位整數,取值范圍在-32,768~32,767之間。
·ushort型為無符號16位整數,取值范圍在0~65,535之間。
·int型為有符號32位整數,取值范圍在-2,147,483,648~ 2,147,483,647之間。
·uint型為無符號32位整數,取值范圍在  0 ~ 4,294,967,295之間。
·long型為64位有符號整數,取值范圍在9,223,372,036,854,775,808~ 9,223,372,036,854,775,807之間。
·ulong型為64位無符號整數,取值范圍在0 ~ 18,446,744,073,709,551,615之間。

    VB和C程序員都可能會對int和long數據類型所代表的新范圍感到驚訝。和其它的編程語言相比,在C#中,int不再取決
于一個機器的字(Word)的大小,而long被設成64位。

4.1.1.2  布爾型
    布爾數據類型有true和false兩個布爾值。可以賦于true或false值給一個布爾變量,或可以賦于一個表達式,其所求
出的值等于兩者之一:
bool bTest = (80 > 90);
         與C和C++相比,在C#中,true值不再為任何非零值。不要為了增加方便而把其它整型轉換成布爾型。

4.1.1.3  字符型
    字符型為一個單Unicode 字符。一個Unicode字符16位長,它可以用來表示世界上多種語言。可以按以下方法給一個字
符變量賦值:
char chSomeChar = 'A';
     除此之外,可以通過十六進制轉義符(前綴/x)或Unicode表示法給變量賦值(前綴/u):
char chSomeChar = '/x0065';
char chSomeChar = '/u0065';
    不存在把char轉換成其它數據類型的隱式轉換。這就意味著,在C#中把一個字符變量當作另外的整數數據類型看待是
行不通的——這是C程序員必須改變習慣的另一個方面。但是,可以運用顯式轉換:
char chSomeChar = (char)65;
int nSomeInt = (int)'A';
      在C中仍然存在著轉義符(字符含義)。要換換腦筋,請看表4.1。

Table 4.1 轉義符( Escape Sequences)

轉義符                  字符名
/'                            單引號
/"                           雙引號
//                           反斜杠
/0                        空字符
/a                        感嘆號(Alert  )
/b                        退格
/f                        換頁
/n                       新行
/r                        回車
/t                       水平 tab
/v                      垂直tab

4.1.1.4  浮點型
     兩種數據類型被當作浮點型:float和double。它們的差別在于取值范圍和精度:
     float: 取值范圍在 1.5x10^-45~ 3.4x10^38之間, 精度為7位數。
     double: 取值范圍在 5.0x10^-324 ~ 1.7x10^308之間, 精度為 15~16 位數。
    當用兩種浮點型執行運算時,可以產生以下的值:
    正零和負零
    正無窮和負無窮
    非數字值(Not-a-Number,縮寫NaN)
    非零值的有限數集
    另一個運算規則為,當表達式中的一個值是浮點型時,所有其它的類型都要被轉換成浮點型才能執行運算。

4.1.1.5   小數型(The decimal Type)
    小數型是一種高精度、128位數據類型,它打算用于金融和貨幣的計算。它所表示的范圍從大約1.0x10^-28 到
7.9x10^28,具有28至29位有效數字。要注意,精度是以位數 (digits)而不是以小數位(decimal places)表示。運算準確
到28個小數位的最大值。
    正如你所看到的,它的取值范圍比double的還窄,但它更精確。因此,沒有decimal和double之間的隱式轉換——往一
個方向轉換可能會溢出,往另外一個方向可能會丟失精度。你不得不運用顯式轉換。
     當定義一個變量并賦值給它時,使用 m 后綴以表明它是一個小數型:
          decimal decMyValue = 1.0m;
     如果省略了m,在變量被賦值之前,它將被編譯器認作double型。

4.1.2  結構類型
     一個結構類型可以聲明構造函數、常數、字段、方法、屬性、索引、操作符和嵌套類型。盡管列出來的功能看起來象
一個成熟的類,但在C#中,結構和類的區別在于結構是一個值類型,而類是一個引用類型。與C++相比,這里可以用結構關
鍵字定義一個類。
    使用結構的主要思想是用于創建小型的對象,如Point和FileInfo等等。你可以節省內存,因為沒有如類對象所需的那
樣有額外的引用產生。例如,當聲明含有成千上萬個對象的數組時,這會引起極大的差異。
    清單4.1  包含一個命名為ip的簡單結構,它表示一個使用byte類型的4個字段的IP地址。我不包括方法等,因為這些
工作正如使用類一樣,將在下一章有詳細的描述。

清單4.1   定義一個簡單的結構

1: using System;
2:
3: struct IP
4: {
5:  public byte b1,b2,b3,b4;
6: }
7:
8: class Test
9: {
10:  public static void Main()
11:  {
12:   IP myIP;
13:   myIP.b1 = 192;
14:   myIP.b2 = 168;
15:   myIP.b3 = 1;
16:   myIP.b4 = 101;
17:   Console.Write("{0}.{1}.",myIP.b1,myIP.b2);
18:   Console.Write("{0}.{1}",myIP.b3,myIP.b4);
19:  }
20: }

4.1.3  枚舉類型
   當你想聲明一個由一指定常量集合組成的獨特類型時,枚舉類型正是你要尋覓的。最簡單的形式,它看起來可能象這
樣:
        enum MonthNames { January, February, March, APRil };
   因我慣用缺省設置,故枚舉元素是int型,且第一個元素為0值。每一個連續的元素按1遞增。如果你想給第一個元素直
接賦值,可以如下把它設成1:
        enum MonthNames { January=1, February, March, April };
    如果你想賦任意值給每個元素——甚至相同的值——這也沒有問題:
        enum MonthNames { January=31, February=28, March=31, April=30 };
    最后的選擇是不同于int的數據類型??梢栽谝粭l語句中按如此賦值:
         enum MonthNames : byte { January=31, February=28, March=31, April=30 };
    你可以使用的類型僅限于long、int、short和byte。


4.2   引用類型
    和值類型相比,引用類型不存儲它們所代表的實際數據,但它們存儲實際數據的引用。在C#中提供以下引用類型給你
使用:
·對象類型
·類類 型
·接口
·代表元
·字符串類型
·數組

4.2.1  對象類型
    對象類型是所有類型之母——它是其它類型最根本的基類。因為它是所有對象的基類,所以可把任何類型的值賦給
它。例如,一個整型:
         object theObj = 123;
    給所有的C++程序員一個警告:object并不等價于你可能正在尋找的void*。無論如何,忘掉指針總是個好主意。
    當一個值類型被加框(作為一個對象利用)時,對象類型就被使用了。這一章稍后會討論到加框和消框

4.2.2   類類型
    一個類類型可以包含數據成員、函數成員和嵌套類型。數據成員是常量、字段和事件。函數成員包括方法、屬性、索
引、操作符、構造函數和析構函數。類和結構的功能是非常相似的,但正如前面所述,結構是值類型而類是引用類型。
    和C++相比,僅允許單繼承。(你不能擁有派生一個新對象的多重基類。)  但是,C#中的一個類可以派生自多重接
口,該接口在下一節將得到描述。
    第五章 “類”專門討論使用類編程。這一節僅打算給出C#類在哪里適合類型圖的一個全貌。

4.2.3  接口
     一個接口聲明一個只有抽象成員的引用類型。跟C++中相似的概念為:一個結構的成員,且方法等于0。如果你不知道
那些概念的任何東西,這里就是在C#中一個接口實際所做的。僅僅只存在著方法標志,但根本就沒有執行代碼。這就暗示
了不能實例化一個接口,只能實例化一個派生自該接口的對象。
     可以在一個接口中定義方法、屬性和索引。所以,對比一個類,接口有什么特殊性呢?當定義一個類時,可以派生自
多重接口,而你只能可以從僅有的一個類派生。
     你可能會問:"OK,但我必須實現所有的接口成員,那么我能從這個途徑得到什么呢?" 我想舉一個來自.NET的例子:
很多類實現了IDictionary 接口。你可以使用簡單的類型轉換訪問接口:
IDictionary myDict = (IDictionary)someobjectthatsupportsit;
     現在你的代碼可以訪問字典了。可等等,我說很多類可以實現這個接口——所以,你可以在多個地方重用代碼來訪問
IDictionary 接口!一旦學會,任何地方都可使用。
     當你決定在類設計中使用接口時,學習更多關于面向對象的設計是個好主意。這本書不能教你這些概念,但你可以學
習如何創建接口。以下的代碼段定義接口IFace,它只有一個方法:
interface IFace
{
void ShowMyFace();
}
     正如我所提到的,不能從這個定義實例化一個對象,但可以從它派生一個類。因此,該類必須實現ShowMyFace抽象方
法:
class CFace:IFace
{
public void ShowMyFace()
{
  Console.WriteLine("implementation");
}
}

   接口成員和類成員的區別在于,接口成員不能被實現。因此,我不想在下一章中再次提到這一點。

4.2.4  代表元
    一個代表元封裝了具有一些標志的一個方法?;旧希碓穷愋桶踩秃瘮抵羔樀陌踩姹?回調功能)??梢酝?br>時在一個代表元實例中同時封裝靜態和實例方法。
盡管你可以用代表員當作具有方法,但它們的主要用途是擁有有一個類事件。再次,我想把你引到下一章,那里會詳細地
討論類。
4.2.5  字符串類型
   C程序員可能會詫異,但當然,C#有一個用于操作字符串數據的基本字符串類型。字符串類直接派生自對象,且它是被
密封的,這意味著再不能從它派生類。就象其它類型,字符串是預定義類System String的一個別名。
   它的用法十分簡單:
string myString = "some text";
   合并字符串同樣簡單:
string myString = "some text" + " and a bit more";
   而如果你想訪問單個字符,所要做的就是訪問下標:
char chFirst = myString[0];
當比較兩個字符串是否相等時,簡單地使用"=="比較操作符。
if (myString == yourString) ...
我只不過想提到,盡管字符串是一個引用類型,比較時是比較值,而不是比較引用(內存地址)。
   字符串類型幾乎用于這本書的每一個例子中,而且在這些例程中,我會介紹給你一些由字符串對象所顯露的極其有趣的
方法。
4.2.6  數組
     一個數組包含有通過計算下標訪問的變量。所有包含于數組中且被當作元素的變量必須是同一類型。這種類型自然被
稱為"數組類型"。數組可以存儲整數對象、字符串對象或者 你提出的任何對象。
      數組的維數就是所謂的排(rank),它決定了相關數組元素的下標數。最常用的數組是一維數組(第一排)。一個多維
數組具有的排數大于1 。每個維的下標始于0,終于維的長度減1 。
應有足夠的理論支持。讓我們看一下用一個數組初始化器( array initializer)初始化的數組:
string[] arrLanguages = { "C", "C++", "C#" };
     該簡寫效果等同以下:
arrLanguages[0]="C"; arrLanguages[1]="C++"; arrLanguages[2]="C#";
     而編譯器為你做了所有的工作。當然,它將同樣為多維數組初始化器工作:
int[,] arr = {{0,1}, {2,3}, {4,5}};
     它是以下的簡寫:
arr[0,0] = 0; arr[0,1] = 1;
arr[1,0] = 2; arr[1,1] = 3;
        arr[2,0] = 4; arr[2,1] = 5;
    如果你不想事先初始化一個數組,但知道了它的大小,該聲明就象這樣:
        int[,] myArr = new int[5,3];
    如果數組的大小必須動態地被計算,用于數組創建的語句可以象這樣寫:
        int nVar = 5;
        int[] arrToo = new int[nVar];
    正如我在這一節開始所陳述的,你可以往數組里面塞任何東西,只要所有的元素類型都相同。因此,如果你想把任何
東西放進一個數組,就聲明它的類型為對象:

4.3  加框和消框
      這一章的課程中,我已經給出了各式各樣的值類型和引用類型。由于速度的原因,你會使用值類型——它除了占據
一定空間的內存塊外,就沒有什么了。但是,有時對象的方便性就象值類型一樣好用。
      這就是加框和消框登上了舞臺的地方,加框和消框是C#類型系統的核心概念。通過允許一個值類型轉換成類型對象
或從類型對象轉換成值類型,這種機制形成了值類型和引用類型之間的捆綁連接。任何東西終究是一個對象——但是,僅
當需要它們是對象時。
4.3.1  加框轉換
     給一個值加框指隱式地把任何值類型轉換成類型對象。當一個值類型被加框時,一個對象實例就被分配,且值類型的
值被拷貝給新的對象。
看以下例子:
        int nFunny = 2000;
        object oFunny = nFunny;
     第二行的賦值暗示調用一個加框操作。nFunny整型變量的值被拷貝給oFunny對象。現在整型變量和對象變量都同時存
在于棧中,但對象的值居留在堆中。
      那么,它暗示著什么呢?它們的值互相獨立——在它們之間沒有連接。(oFunny沒有引用nFunny的值。)  以下代碼說
明了結果:
        int nFunny = 2000;
        object oFunny = nFunny;
        oFunny = 2001;
        Console.WriteLine("{0} {1}", nFunny, oFunny);
     當代碼改變oFunny的值時,nFunny的值并沒有改變。只要你腦袋中有這個copy動作,就能夠使用值類型的對象功能,
發揮出你的巨大優勢!
4.3.2  消框轉換
    和加框相比,消框是顯式操作——必須告訴編譯器,你想從對象中抽取出哪一種值類型。當執行消框操作時,C#檢測
所請求的值類型實際上存儲在對象實例中。經過成功的校驗,該值被消框。

    這就是消框如何執行:
int nFunny = 2000;
object oFunny = nFunny;
int nNotSoFunny = (int)oFunny;

    如果錯誤地請求一個double值
double nNotSoFunny = (double)oFunny;
通用語言運行時(Common Language Runtime,簡寫CLR)將會引發一個InvalidCastException異常。你可以在第7章 "異常處
理" 中學到更多有關異常處理的知識。

4.4  小結
    在這一章中,你學到了C#中用到的各種類型。簡單的值類型包括整型、布爾型、浮點型和小數型。你會非常經常地用
到一些類型,進行數學和金融的計算,還有邏輯表達。
在介紹引用類型之前,我顯示了一個看起來象類的結構類型。它幾乎如一個類般地運作,但它只是一個值類型,這使它更
加適合需要有大量的小對象的場合。
    引用類型起始于所有對象之母的objedt本身。object是C#中所有對象的基類,且它同樣用于值類型的加框和消框。除
此之外,我還讓你領略了代表元、字符串和數組。
    令C#程序員十分神氣的類型就是類。它是C#面向對象編程的心臟,下一章整章專門讓你迅速理解這個激動人心且功能
強大的類型。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一区在线视频| 亚洲国产欧美精品| 欧美日韩精品在线| 亚洲图片欧美午夜| 精品日韩美女的视频高清| 国产精品露脸自拍| 精品视频中文字幕| 欧美激情区在线播放| 亚洲人午夜精品免费| 91极品女神在线| 91在线观看免费观看| 亚洲黄色有码视频| 爽爽爽爽爽爽爽成人免费观看| 国产日韩综合一区二区性色av| 久久久久国产一区二区三区| 亚洲精品成人久久电影| 黑人极品videos精品欧美裸| 欧美激情啊啊啊| 国产精品一区二区三区免费视频| 久久影院在线观看| 国产日韩在线视频| 成人午夜两性视频| 欧美激情亚洲另类| 日韩亚洲综合在线| 国产日韩中文在线| 欧美香蕉大胸在线视频观看| 中文字幕一区二区三区电影| 国产91精品视频在线观看| 欧美精品激情在线| 日韩电影免费在线观看中文字幕| 亚洲欧美中文字幕| 国产精品亚洲综合天堂夜夜| 精品国产欧美一区二区三区成人| 日韩精品视频在线免费观看| 91天堂在线视频| 成年人精品视频| 色综合天天综合网国产成人网| 国产91热爆ts人妖在线| 欧美一级bbbbb性bbbb喷潮片| 久久艳片www.17c.com| 热久久这里只有精品| 啪一啪鲁一鲁2019在线视频| 国产成人在线亚洲欧美| 亚洲人成在线观| 久久久久中文字幕2018| 亚洲精品电影久久久| 国产精品美腿一区在线看| 91夜夜未满十八勿入爽爽影院| 欧美大码xxxx| 韩国国内大量揄拍精品视频| 色多多国产成人永久免费网站| 国产婷婷97碰碰久久人人蜜臀| 91中文字幕一区| 亚洲国产精品va在线| 国外色69视频在线观看| 久久国产精品久久国产精品| 国产91精品黑色丝袜高跟鞋| 精品国产乱码久久久久久虫虫漫画| 亚洲人成伊人成综合网久久久| 国产精品美女网站| 亚洲天堂第二页| 国产精品久久久久久亚洲调教| 亚洲成人久久久久| 亚洲精品日韩av| 欧美乱妇40p| 亚洲性视频网址| 日韩精品999| 日韩欧美国产高清91| 久久久欧美精品| 亚洲乱码av中文一区二区| 最近2019中文字幕在线高清| 亚洲国产高潮在线观看| 国产91ⅴ在线精品免费观看| 亚洲欧美国产精品va在线观看| 亚洲xxxxx电影| 欧美中文字幕在线| 欧美日韩免费在线观看| 久久久久久亚洲| 国产欧美精品日韩精品| 日韩欧美精品中文字幕| 日韩在线www| 97精品久久久| 国产一区二区三区在线免费观看| 在线日韩日本国产亚洲| 久久久影视精品| 久久精品99久久香蕉国产色戒| 亚洲香蕉伊综合在人在线视看| 57pao国产成人免费| 日本一区二区三区在线播放| 亚洲精品成人av| 日韩在线视频二区| 国产一区视频在线| 亚洲а∨天堂久久精品喷水| 欧美激情精品久久久久久久变态| 亚洲最新在线视频| 岛国av一区二区三区| 国产精品久久久久久久天堂| 久久成人国产精品| 中文字幕在线观看日韩| 亚洲一区二区在线播放| 亚洲精品美女在线| 亚洲欧美在线一区二区| 亚洲人成电影网站| 欧日韩不卡在线视频| 国产精品18久久久久久麻辣| 热久久这里只有| 日韩av免费观影| 岛国av一区二区| 国产精品精品久久久| 伦理中文字幕亚洲| 91精品国产高清| 一区二区三区www| 国产精品女视频| 日韩精品久久久久久福利| 亚洲精品xxx| 日本人成精品视频在线| 成人xvideos免费视频| 最近中文字幕mv在线一区二区三区四区| 亚洲国模精品一区| 91精品国产综合久久香蕉| 成人黄色免费在线观看| 亚洲无限av看| 亚洲性线免费观看视频成熟| 亚洲福利视频网| 精品成人乱色一区二区| 亚洲人成伊人成综合网久久久| 国产精品黄色影片导航在线观看| 国产欧美一区二区三区在线看| 欧美亚洲在线观看| 久久综合伊人77777蜜臀| 日韩成人av在线| 97在线看免费观看视频在线观看| 伊人男人综合视频网| 久久久久久久香蕉网| 狠狠色香婷婷久久亚洲精品| 成人黄色片网站| 欧美日韩国产激情| 欧美高清无遮挡| 成人免费网站在线观看| 综合激情国产一区| 国产精品久久久久aaaa九色| 亚洲欧美色图片| 欧美性jizz18性欧美| 亚洲精品videossex少妇| 国产精品影片在线观看| 97在线观看免费高清| 国产精品免费视频xxxx| 久久久久久久久91| 色妞在线综合亚洲欧美| 久久精品中文字幕免费mv| 亚洲精品视频在线播放| 亚洲免费中文字幕| 98精品在线视频| 久久免费少妇高潮久久精品99| 亚洲精品久久久久久久久| 久久久999精品免费| 国产在线观看一区二区三区| 91精品综合久久久久久五月天| 亚洲自拍高清视频网站| 在线观看成人黄色| 成人在线视频福利| 国产中文字幕亚洲| 中文亚洲视频在线| 国产精品自拍小视频|