飄過來學C#系列(1)之------對象和類型

來源:互聯網
上載者:User

標籤:des   blog   color   io   os   使用   ar   strong   檔案   

1.1 類和結構

類是儲存在堆上的參考型別,而結構是儲存在棧上的實值型別.

類使用的關鍵詞是class,而結構使用的是struct生聲明.

1.2 資料成員

資料成員是包含類的資料-----欄位,常量和事件的成員.資料成員可以是待用資料.類成員總是執行個體成員,除非用static進行顯式聲明.

常量與類的關聯方式同變數與類的關聯方式.使用const關鍵字來聲明常量.

如果聲明為public就可以在類的外部存取它

事件是類的成員,在發生某些行為(如改變類的欄位或屬性,或者進行了某種形式的使用者互動操作)時,

它可以讓對象通知調用方.客戶可以包含所謂"事件處理常式"的代碼來響應該時間.

1.3 函數成員

函數成員提供操作類中資料的某些功能,包括方法,屬性,建構函式和終結器,運算子以及索引器.

1.4 方法

(1)聲明方法

方法定義包括任意方法修飾符,傳回值的類型,然後依次是方法名和輸入參數的列表和方法體.

public string GetUserName([parameters])

{

  return  ;
}

如果沒有傳回值指定void

(2)方法的調用

string name=GetUserName([parameters]);

(3)方法傳遞參數

class Program{    static void SomeFunction(int[] ints, ref int i)    {        ints[0] = 100;        i = 100;    }    public static int Main()    {        int i = 0;        int[] ints = { 0, 1, 2, 4, 8 };        Console.WriteLine("i=" + i);        Console.WriteLine("ints[0]=" + ints[0]);        Console.WriteLine("Calling SomeFunction.");        SomeFunction(ints,ref i);        Console.WriteLine("i=" + i);        Console.WriteLine("ints[0]=" + ints[0]);        Console.ReadKey();        return 0;    }}                      

結果為

i =0

ints[0]=0

Calling SomeFunction

i = 100

ints[0]=100

ref關鍵字,如果把一個參數傳遞給方法,且這個方法的輸入參數前帶有ref關鍵字,則該方法對變數所做的任何改變都會影響原始對象的值.

(4)out參數

在方法的輸入參數前面加上out首碼時,傳遞給該方法的變數可以不初始化.該變數通過引用傳遞,所以在從被調用的方法中返回時

對應方法對該變數進行的任何改變都會保留下來,在調用該方法時,還需要使用out關鍵字,在與定義該方法時一樣.

(5) 方法的重載

聲明同名但參數個數或類型不同的方法即可.

class MyClass{  int DoSomething(int x)  {    DoSomething(x,10);  }  int DoSomething(int x,int y)  {    //方法實現  }}  

1.5 屬性

屬性其實就是一個方法或一對方法,在用戶端代碼看來就是一個欄位.例如Windows表單的Height屬性.

public string Name{  get  {    return _name;  }  set  {    _name = value;  }}  

1.6 建構函式

一般情況下如果沒有提供任何建構函式,編譯器會在後台建立一個預設的建構函式.如果提供了帶參數的建構函式

編譯器就不會自動提供.

public class MyNumber{  private int number;  private MyNumber(int number)  {    this.number = number;  }}

  

(1)靜態建構函式

為何使用靜態建構函式:當我們第一次使用類之前,從外部源中初始化這些靜態欄位和屬性的時候.

public class UserPreferences{  public static readonly Color BackColor;  static UserPreferences()  {    DateTime now = DateTime.Now;    if(now.DayOfWeek == DayOfWeek.Saturday||now.DayOfWeek == DayOfWeek.Sunday)      BackColor= Color.Green;    else      BackColor = Color.Red;  }  private UserPreferences()    {    }}

  

編譯UserPreferences.BackColor.ToString();

得到的結果 Red如果在周末執行Green

 (2)建構函式相互調用

 class Car    {        private string description;        private uint nWheels;        public Car(string description,uint nWheels)        {            this.description = description;            this.nWheels = nWheels;        }        public Car(string description)        {            this.description = description;            this.nWheels = 4;        }    }

 這兩個建構函式初始化了相同的欄位,顯然最好把所有的代碼放在同一個地方,利用建構函式初始化器可以實現.

class Car    {        private string description;        private uint nWheels;        public Car(string description,uint nWheels)        {            this.description = description;            this.nWheels = nWheels;        }        public Car(string description):this(description,4)        {        }    }

 唯讀欄位

唯讀欄位即不可修改.readonly關鍵字比const靈活得多,允許把一個欄位設定為常量,但還需要執行一些計算,以確定它的初始值.

其規則是可以再建構函式中給唯讀欄位賦值,但不能再其他地方賦值.唯讀欄位還可以是一個執行個體欄位,而不是靜態欄位.

class Car
{  public static readonly uint MaxDocuments;  static Car()  {    MaxDocuments = DoSomethingToFindOutMaxNumber();  }}

  在本例中,欄位是靜態,每次運行程式的執行個體,只需儲存MaxDocuments一次.這就是在靜態建構函式中初始化它的原因.

 匿名型別

var關鍵字建立匿名型別

1.7 結構

結構是實值型別,不是參考型別.它們儲存在棧中或儲存為內聯,其生存周期的限制與簡單的資料類型一樣.

結構不支援繼承

對於結構建構函式的工作方式有一些區別,尤其是編譯器總是提供一個無參數的預設建構函式,它是不允許替換的.

使用結構,可以置頂欄位如何在記憶體中的布局.

結構的預設建構函式把數值欄位都初始化為0,把參考型別欄位初始化為null,且總是隱式給出,即使提供了其他帶

參數的建構函式,也是如此,提供欄位的初始值也不能繞過預設建構函式.

下面代碼會產生編譯錯誤

  struct Dimensions    {        public double Length = 1;        public double Width = 2;    }

1.8 部分類

partial關鍵字允許把類,結構或介面放在多個檔案中.一般情況下,一個類全部駐留在單個檔案中.

 partial class TheBigClass : TheBigBaseClass, IBigClass    {        public void MethodOne()        {        }    }    partial class TheBigClass : IOtherBigClass    {        public void MethodTwo()        {        }    }

編譯之後等價於

 partial class TheBigClass : TheBigBaseClass, IBigClass,IOtherBigClass    {        public void MethodOne()        {        }        public void MethodTwo()        {        }    }

1.9 靜態類

 如果類中只包含靜態方法和屬性,該類就是靜態.

static class StaticUtilities{    public static void HelperMethod()    {    }}

 調用HelperMethod()不需要StaticUtilities類型的對象.直接StaticUtilities.HelperMethod();

2.0 Object類

所有的.NET類都派生自System.Object

ToString()方法---格式化

GetHashTable()方法----索引值擷取

Equals()方法---對象比較

Finalize()-----記憶體回收

GetType()----擷取類資訊

MemberwiseClone()---複製對象

飄過來學C#系列(1)之------對象和類型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.