国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

C# Language Specification 5.0 (翻譯)第四章 類型

2019-11-17 02:13:52
字體:
來源:轉載
供稿:網友

C# Language Specification 5.0 (翻譯)第四章 類型

C# Language Specification 5.0

C# 語言的類型分為兩大類:值類型(value type)和引用類型(reference type),而它們又都同時具有至少一個類型形參的泛型類型(generic type)。類型形參(type parameters)能同時指定值類型和引用類型。

type

第三類是指針(pointers),只能用于非安全代碼(unsafe code)中。關于非安全代碼,將在第十八章第二節內討論。

值類型與引用類型不同之處在于值類型的變量直接包含其數據,而引用類型的變量保存對其數據的引用(references),后者被稱為對象(objects)。對于引用類型,可能兩個變量能引用同一個對象,也可能因操作一個變量所引用的對象而影響到其它變量。對于值類型,每個變量都擁其數據之副本,不會因操作其一而影響其它。

C# 的類型系統擁有統一標準,任何類型的值都能被當做對象來處理(a value of any type can be treated as an object)。C# 中每種類型都直接或間接派生自 object 類類型,object 是所有類型的最終基類(ultimate base class)。引用類型的值都被視為 object 類型故被簡單當做對象來處理。值類型的值通過裝箱與拆箱操作來實現類型處理(第四章第三節)。


值類型

值類型(value type)可以是一個結構類型(struct type),也可以是一個枚舉類型(enumeration type)。C# 提供了一組預定義的結構類型,稱作簡單類型(simple types)。簡單類型通過保留字(reserved Words)[1]標識(identified)。

value-type

與引用類型的變量不同,值類型的變量只有在類型是可空類型(nullable type)時才可以包含空值(null)。每一個非可空值類型(non-nullable value type)都有一個對應的可空值類型,它們具有相同的值集(只是額外再加上一個 null 值)。

對值類型變量的賦值會在賦值過程中創建一個值的副本。這與對一個引用類型變量賦值不同,引用類型只拷貝引用,而不是引用標識的對象。

System.ValueType 類型

所有值類型均隱式繼承自 System.ValueType 類,后者又繼承自 object 類。不可能對值類型進行派生,值類型都隱式密封(implicitly sealed,第十章第 1.1.2 節)的。

注意,System.ValueType 自身并不是值類型(value-type)。確切地講,它是一個類類型(class-type),所有的值類型(value-type)都自動派生自它。

默認構造函數

所有值類型均隱式聲明了一個公共無參實例構造函數(public parameterless instance constructor),稱作默認構造函數(default constructor)。默認構造函數返回一個零初始化實例(zero-initialized instance),它就是值類型的默認值(default value):

  • 對于所有簡單類型(simple-type)來說,默認值為所有位都為零的位模式(bit pattern of all zeros)產生的值:
  • 對于 sbyte, byte, short, ushort, int, uint, long, and ulong 來說,默認值為 0
  • 對于 char 來說,默認值為 '/x0000'
  • 對于 float 來說,默認值為 0.0f
  • 對于 double 來說,默認值為 0.0d
  • 對于 decimal 來說,默認值為 0.0m
  • 對于 bool 來說,默認值為 false
  • 對于枚舉類型(enum-type)E 來說,默認值為 0,該值被轉換為類型 E
  • 對于結構類型(struct-type)來說,默認值為通過設置其內所有值類型的值為其默認值、所有引用類型的值為 null 而產生的值;
  • 對于可空類型(nullable-type)來說,默認值為屬性 HasValue 為 false 且屬性 value 未定義的(undefined)的實例。默認值也可以叫做可空值類型的 null 值(null value)。

和其它實例構造函數一樣,值類型的默認構造函數也通過 new 操作符來調用。出于效率的緣故,實際上我們不必去執行調用它的構造函數。在下例中,變量 i 和 j 都會初始化為零(zero)。

class A{    void F() {        int i = 0;        int j = new int();    }}

因為每個值類型都隱式擁有一個公開無參實例構造函數,所以結構類型中不可以顯式包含一個無參構造函數的聲明,但允許結構類型聲明參數化實例構造函數(parameterized instance constructors,第十一章第 3.8 節)。

結構類型

結構類型(struct type)是能聲明常量、字段、方法、屬性、索引器、操作符、實例構造函數、靜態構造函數和嵌套類型的值類型。構造類型的聲明在第十一章第一節中有描述。

簡單類型

C# 提供了一組預定義的結構類型,稱作簡單類型(simple type)。簡單類型通過保留字進行識別,但這些保留字也只是簡單地為預定義于 System 命名空間內的結構類型提供了別名,如下表所示:

保留字別名對應的類型
sbyteSystem.SByte
byteSystem.Byte
shortSystem.Int16
ushortSystem.UInt16
intSystem.Int32
uintSystem.UInt32
longSystem.Int64
ulongSystem.UInt64
charSystem.Char
floatSystem.Single
doubleSystem.Double
boolSystem.Boolean
decimalSystem.Decimal

由于簡單類型是結構類型的別名,故每一個簡單類型都有成員。比方說 int 有聲明于 System.Int32 內的成員以及繼承自 System.Object 的成員,下面這些語句是合法的:

int i = int.MaxValue;       // System.Int32.MaxValue 常量string s = i.ToString();    // System.Int32.ToString() 實例方法string t = 123.ToString();  // System.Int32.ToString() 實例方法

簡單類型與其它結構類型不同之處在于它們允許某些額外的操作:

  • 大部分簡單類型允許通過書寫字面值(literals)來創建值(第二章第 4.4 節)。比方說,123 是 int 類型的字面值,'a' 則是一個字符的字面值。C# 總體來說不對結構類型的字面值做過多規定,因此其它結構類型的非默認值(non-default values)總是通過這些結構類型的實例構造函數來創建。
  • 當表達式操作數都是些簡單類型常量時,可能會使編譯器在「編譯時」對表達式進行計算。此種表達式叫做常量表達式(constant-exPRession,第七章第十九節)。由其他結構類型定義的表達式調用操作符不被視為常量表達式。
  • 通過 const 聲明可在簡單類型內聲明一個常量(第十章第四節)。常量不可屬于其它結構類型,但可使用靜態只讀字段(static readonly fields)達到相似目的。
  • 簡單類型的轉換調用可參與(participate)由其它結構類型所定義的轉換操作符(conversion Operators)來計算,但用戶定義轉換操作符(user-defined conversion operator)永不可參與其它用戶定義操作符之計算(第六章第 4.3 節)。

整數類型

C# 支持九中整數類型(integral type):sbyte, byte, short, ushort, int, uint, long, ulong 以及 char。整數類型值的尺寸與范圍如下:

  • sbyte 類型表示有符號(signed)的 8 位(8-bit)整數,區間為 -128 到 127;
  • byte 類型表示無符號(unsigned)的 8 位(8-bit)整數,區間為 0 到 255;
  • short 類型表示有符號的 16 位(16-bit)整數,區間為 -32768 到 32767;
  • ushort 類型表示無符號的 16 位(16-bit)整數,區間為 0 到 65535;
  • int 類型表示有符號的 32 位(32-bit)整數,區間為 -2147483648 到 2147483647;
  • uint 類型表示無符號的 32 位(32-bit)整數,區間為 0 到 4294967295;
  • long 類型表示有符號的 64 位(64-bit)整數,區間為 –9223372036854775808 到 9223372036854775807;
  • ulong 類型表示無符號的 64 位(64-bit)整數,區間為 0 到 18446744073709551615;
  • char 類型表示無符號的 16(16-bit)位整數,區間為 0 到 65535。其字符類型的取值范圍符合 Unicode 字符集。盡管 char 字符表現形式與 ushort 一樣,但對其中一種類型進行的所有操作不一定可以對另一種類型進行。

整數類型的一元操作符(unary operator)和二元操作符(binary operator)可以操作有符號 32 位精度(precision)、無符號 32 位精度、有符號 64 位精度和無符號 64 位精度的操作數:

  • 對于一元操作符 +~,操作數(operand)會被轉換為類型 T,其中 T 為 int, uint, long 或 ulong 中首個可完全表示操作數所有可能值的類型,而后用類型 T 的精度進行計算,其結果為 T 類型的。
  • 對于一元操作符 -,操作數(operand)會被轉換為類型 T,其中 T 為 int, long 中首個可完全表示操作數所有可能值的類型,然后在 T 類型的精度下進行計算,其結果為 T 類型。一元操作符 - 不支持 ulong 操作數。
  • 對于二元操作符 +-*/%&^|==!=><>= 以及 <=,操作數會被轉換為類型 T,其中 T 是 int, uint, long 或 ulong 中首個可完全表示兩個操作數所有可能值的類型,然后在 T 類型的精度下進行計算,其結果為 T 類型(如果是關系操作符,則返回 bool)。二元操作符不允許一個操作數是 long 而另一個操作數是 ulong。
  • 對于二元操作符 <<>>,左操作數被轉換為類型 T,其中 T 為 int, uint, long 或 ulong 中首個可完全表示操作數的所有可能值的類型,而后用類型 T 的精度執行運算,其結果是 T 類型的。

雖然 char 被分類到整形,但它與其它整形在以下兩處地方不同:

  • 不存在從其他類型到 char 類型的隱式轉換。具體來講,即便從 sbyte, byte 或 ushort 類型具有能完整地表示為 char 類型的取值范圍,但它們也不能隱式地轉換為 char 類型。
  • char 類型的常量必須被寫為 character-literals 或帶有(combination)強制轉換類型(cast)為 char 的 integer-literals。比方說 (char)10'/x000A' 一樣。

checkedunchecked 操作符和語句用于控制 integral-type 算術運算(arithmetic operations)與轉換(conversions,第七章第 6.12 節)的溢出檢查(overflow checking)。在 checked 上下文(context)中,溢出會導致「編譯時錯誤」或導致一個 System.OverflowException 異常被拋出。在 unchecked 上下文中,溢出會被忽略(ignored),并且所有與目標類型(destination type)不匹配(not fit)的高位(high-order bits)都會被丟棄。

浮點數類型

C# 支持兩種浮點數(floating-point)類型:float 和 double。float 和 double 類型表示為使用 32

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柘城县| 元阳县| 青神县| 区。| 绥棱县| 新宁县| 景洪市| 栾城县| 南丹县| 楚雄市| 阳信县| 宾川县| 临猗县| 瑞昌市| 潞西市| 田东县| 句容市| 大石桥市| 邵武市| 邯郸县| 都兰县| 芒康县| 昭通市| 龙游县| 惠水县| 姜堰市| 明溪县| 宁乡县| 新巴尔虎右旗| 扬州市| 额济纳旗| 邵武市| 嘉义市| 营山县| 上林县| 盐山县| 城口县| 英吉沙县| 湖州市| 廉江市| 安宁市|