The Overview of ECMA C# Language Specialisation (2) (轉)

gugu99發表於2008-06-16
The Overview of ECMA C# Language Specialisation (2) (轉)[@more@]

8.2 型別
支援兩種型別:值和引用。值型別包括簡單的型別(如 char、int 和 float),列舉和結構。引用包括類,
介面,和矩陣。
值與引用的不同在於值的變數直接包含它的資料,而引用的變數只是的引用。使用引用可以使兩個變數
同時引用一個物件,這樣對一個變數的操作就會影響另一個引用同一個物件的變數。但每個值都有自己的一份資料
複製,使變數之間互不影響。

using System;
class Class1
{
 public int Value = 0;
}
class Test
{
 static void Main() {
 int val1 = 0;
 int val2 = val1;
 val2 = 123;
 Class1 ref1 = new Class1();
 Class1 ref2 = ref1;
 ref2.Value = 123;
 Console.WriteLine("Values: {0}, {1}", val1, val2);
 Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
 }
}

輸出:

Values: 0, 123
Refs: 123, 123

因為 val1 和 val2 都是值變數(int 型別),每個變數都有自己的儲存空間,所以對本地變
量 val1 的賦值不會影響到對 val2 的賦值。
相反地,賦值語句 ref2.Value = 123; 影響 ref1 和 ref2 這兩個引用。這兩行

Console.WriteLine("Values: {0}, {1}", val1, val2);
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);

顯示 Console.WriteLine 字串格式化的一些行為,它使用變數作為引數。第一個引數是可以
有多個佔位符的字串,如 {0} 和 {1}。每個佔位符指向一個變數,{0} 指向第二個引數,{1}
指向第三個:每個佔位符都會被相應的引數代替。在後面會有更進一步地解釋。

開發者可以用列舉和結構定義新的值型別,也可以用類,介面和代理等引用型別來宣告新的型別。

using System;
public enum Color
{
 Red, Blue, Green
}
public struct Point
{
 public int x, y;
}
public interface IBase
{
 void F();
}
public interface rived: IBase
{
 void G();
}
public class A
{
 protected virtual void H() {
 Console.WriteLine("A.H");
 }
}
public class B: A, IDerived
{
 public void F() {
 Console.WriteLine("B.F, implementation of IDerived.F");
 }
 public void G() {
 Console.WriteLine("B.G, implementation of IDerived.G");
 }
 override protected void H() {
 Console.WriteLine("B.H, override of A.H");
 }
}
public delegate void EmptyDelegate();

上面是幾種宣告的例子。在一下的部分中將詳細介紹型別的宣告。

8.2.1 預定義型別

C# 提供了一套預定義型別,其中的大部分對於C/C++開發者來說很親切。
預定義型別包括有符號與無符號整數、浮點、布林、字元和十進位制數。有符號數是 sbyte、short、
int 和 long;無符號數是byte、ushort、uint 和 ulong;浮點是 float 和 double。
bool 型別表示:值只能是 true 或 false。這使寫和自身建指碼和避免錯誤地在應該用“==”時
使用“=”。

int i = …;
F(i);
if (i = 0)  // : the test should be (i == 0)
  G();

上面的程式碼引發一個編譯錯誤,因為 i = 0 的結果是 int 型別,而 if 要求是一個 bool 的結
果。
char 型別表示 Unicode 字元,一個 char 的變數表示一個 16 位的 Unicode 字元。
十進位制數適合於各種計算,填補浮點數的進位錯誤和令人無法接受的表示法。常見的例子是金融
方面的各種計算,比如稅率的計算和貨幣的轉換。十進位制數是一個有 28 位的數字。
下面列出所有的預定義型別及例子:

型別  描述  例子
  最基本的型別  object o = null;
string  Unicode 字串型別  string s = "hello";
sbyte  8位有符號byte  sbyte val = 12;
short  16位有符號短型  short val = 12;
int  32位有符號整型  int val = 12;
long  64為有符號長整型  long val1 = 12;long val2 = 34L;
byte  8位無符號byte  byte val1 = 12;
ushort  16位無符號短型  ushort val1 = 12;
uint  32位無符號整型  uint val1 = 12;uint val2 = 34U;
ulong  64為無符號長整型  ulong val1 = 12;ulong val2 = 34U;ulong val3 = 56L;ulong val4 = 78UL;
float  有符號單精度浮點數  float val = 1.23F;
double  有符號雙精度浮點數  double val1 = 1.23;double val2 = 4.56D;
bool  布林型別;只能是 true 或 false  bool val1 = true;bool val2 = false;
char  字元型別;一個 Unicode 字元  char val = 'h';
decimal  28位精確的十進位制數  decimal val = 1.23M;

每種預定義型別都是一個提供型別的簡略表示。比如,int 是 System.Int32 結構的一種縮
略形式,前者必後者更容易使用。

預定義型別,比如 int,除了一小部分特殊的使用以外,大部分都和一般的結構一樣。運算子
過載可以定義一個類似預定義型別的新結構型別。例如,一個名為 Digit 結構可以提供和預定
義數字型別同樣的數學運算,並且可以定義一個相互轉換的規則。
 
The predefined types employ operator overloading themselves. For example, the
comparison operators == and != have different semantics for different predefined

預定義型別本身也使用過載。例如,比較運算子 == 和 != 與不同的預定義符一起有不同的
語義:

· Two expressions of type int are considered equal if they represent the
same integer value.
· Two expressions of type object are considered equal if both refer to the
same object, or if both are null.
· Two expressions of type string are considered equal if the string
instances have identical lengths and identical characters in each character
position, or if both are null.

·兩個 int 型別用它們的值來判斷是否相等。

·兩個 object 檢查它們所引用的物件是否一樣來判斷是否相等。

·兩個 string 用它們的長度和每個位置的上的元素是否相同來判斷它們是否相等,或者
  兩者都為 null。

using System;
class Test
{
 static void Main() {
 string s = "Test";
 string t = string.Copy(s);
 Console.WriteLine(s == t);
 Console.WriteLine((object)s == (object)t);
 }
}

輸出:

True
False

第一個比較的是 string 型別,而第二個比較的是 object 型別。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1005715/,如需轉載,請註明出處,否則將追究法律責任。

相關文章