C#速成(之二) (轉)

amyz發表於2007-11-25
C#速成(之二) (轉)[@more@]

-------------------
資料型別
-------------------

所有資料型別都派生自基類。這裡有兩類資料型別:

基本型/內建型 自定義型

下面一個C#內建型別列表:

型別 位元組數 解釋 byte 1 無符號位元組型 sbyte 1 有符號位元組型 short 2 有符號短位元組型 ushort 2 無符號短位元組型 int 4 有符號整型 uint 4 無符號整型 long 8 有符號長整型 ulong 8 無符號長整型 float 4 浮點數 double 8 雙精度數 decimal 8 固定精度數 string unicode字串型 char unicode字元型 bool 真假布林型

 

注意:C#當中的型別範圍與C++有所不同;例如,C++的long型是4個位元組,而在C#當中是8個位元組。同樣地,bool型和string型都不同於C++。bool型只接受true和false兩種值。不接受任何整數型別。



使用者定義型別包括: 

類型別(class)

結構型別(struct)

介面型別(interface)


資料型別的分配形式的不同又把它們分成了兩種型別: 

值型別(Value Types)

引用型別(Reference Types) 

值型別:


值型別資料在棧中分配。他們包括:所有基本或內建型別(不包括string型別)、結構型別、列舉型別(enum type)

 

引用型別:

引用型別在堆中分配,當它們不再被使用時將被垃圾收集。它們使用new運算子來建立,對這些型別而言,不存在C++當中的delete運算子,根本不同於C++會顯式使用delete這個運算子去釋放建立的這個型別。C#中,透過垃圾收集器,這些型別會自動被收集處理。

引用型別包括:類型別、介面型別、象陣列這樣的集合型別型別、字串型別、列舉型別

列舉型別與C++當中的概念非常相似。它們都透過一個enum關鍵字來定義。

 

示例:

enum Weekdays
{
  Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
}



類型別與結構型別的比較

除了在記憶體分配形式上外,類與結構的概念完全與C++相同。類的被分配在堆中,並且透過new來建立,結構也是被new建立但卻被分配在棧當中。C#當中,結構型適於訪問和擁有少量成員的資料型別。如果涉及量較多,你應該建立一個類來實現他。

(譯者注:這與堆和棧記憶體分配結構的特點有關。簡而言之,棧是一種順序分配的記憶體;堆是不一定是連續的記憶體空間。具體內容需要大家參閱相關資料)

示例:

struct Date
{
  int day;
  int month;
  int year;
}

class Date
{
  int day;
  int month;
  int year;
  string weekday;
  string monthName;

  public int GetDay()
  {
  return day;
  }

  public int GetMonth()
  {
  return month;
  }

  public int GetYear()
  {
  return year;
  }

  public void SetDay(int Day)
  {
  day = Day ;
  }

  public void SetMonth(int Month)
  {
  month = Month;
  }

  public void SetYear(int Year)
  {
  year = Year;
  }

  public bool IsLeapYear()
  {
  return (year/4 == 0);
  }

  public void SetDate (int day, int month, int year)
  {

  }
...
}

 

-------------------
屬性
-------------------

如果你熟悉C++面象物件的方式,你就一定有一個屬性的概念。在上面示例當中,以C++的觀點來看,Data類的屬性就是day、month和year。用C#方式,你可以把它們寫成Get和Set方法。C#提供了一個更方便、簡單、直接的方式來訪問屬性。

因此上面的類可以被寫成:

using System;
class Date
{
  public int Day{
  get {
  return day;
  }

  set {
  day = value;
  }
  }

  int day;

  public int Month{

  get {
  return month;
  }

  set {
  month = value;
  }
  }

  int month;

  public int Year{

  get {
  return year;
  }

  set {
  year = value;
  }
  }

  int year;

  public bool IsLeapYear(int year)
  {
  return year%4== 0 ? true: false;
  }

  public void SetDate (int day, int month, int year)
  {
  this.day = day;
  this.month = month;
  this.year = year;
  }

}


你可在這裡得到並設定這些屬性:

class User
{

  public static void Main()
  {
  Date date = new Date();
  date.Day = 27;
  date.Month = 6;
  date.Year = ;
  Console.WriteLine("Date: {0}/{1}/{2}", date.Day,
  date.Month,
  date.Year);
  }
}


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

相關文章