1. 程式人生 > 其它 >C#第三章--物件和類

C#第三章--物件和類

------------恢復內容開始------------

1 類和結構

類和結構實際上都是建立物件的模板,每個物件都包含資料,並提供了處理和訪問資料的方法。都用new來宣告例項。

類定義了類的每個物件(例項)可以包含什麼資料和功能。

結構struct是值型別(stack),類class是引用型別(heap),結構不支援繼承;較小的資料型別使用結構可提高效能,但類比結構常用。

2 類

(1) 類成員

靜態成員,static,屬於類

例項成員,屬於物件

靜態欄位,static,值對於每個物件相同

例項欄位,每個物件的例項欄位都可以有不同的值

在呼叫例項方法的例項上,可以通過this顯式地訪問該例項。而在靜態方法中引用this是錯誤的。

https://blog.csdn.net/llll29550242/article/details/6052216?utm_source=blogxgwz1

(2) readonly與const修飾的欄位

readonly修飾符的欄位只能在建構函式中分配值,在執行期間通過建構函式指定只讀欄位的值;可以是例項成員和類成員;可以在宣告時初始化或者採用特定資料型別的預設值;

const修飾符,編譯器通過const,用其值取代了使用它的變數,編譯器知道常量的值;只能是類成員;

(3) 屬性

  • 屬性是一個方法或者方法對,在客戶端程式碼看來,他們是一個欄位。
  • get和set訪問器中必須有一個具備屬性的訪問級別;
  • 省略set即為只讀屬性,只寫屬性用方法替代;
    只讀屬性初始化:
    • 屬性初始化器來初始化 public string Id {get;} ="a";
    • 建構函式中初始化 public Person(string name)=>Name = name;
  • 具有表示式體的屬性訪問器,即把花括號裡的get,set改為:get => _firstName; set =>_firstName=value;
  • 表示式體屬性:只有get的屬性可以用表示式體屬性實現,不需要花括號和return,帶有get屬性但不寫get關鍵字,用lambda操作符。
public string FirstName{get;}
public string
LastName{get;} public string FullName => $"{FirstName} {LastName}";

(4) 匿名型別

var doctor = new{ FirstName = "w", LastName = "m"};

(5) 方法

  • 函式成員不僅包含方法,也包括類或結構的一些非資料成員,如索引器、運算子、建構函式和解構函式,甚至還有屬性;資料成員是欄位,常量和事件;
  • 方法的過載:
    • 方法的幾個版本有不同的簽名,即方法名相同,但引數的個數和資料型別不同。
public void ReturnResult(int result){};
public void ReturnResult(int result, int b){};
  • 命名引數,把引數附上引數名稱,這樣在呼叫方法的時候不必按照原來的引數順序填寫引數,只需要對應好引數的名稱也能完成方法。r.Move(x:1, y:2, z:3);
  • 可選引數,應用可選引數的方法在被呼叫的時可以選擇性的新增需要的引數,而不需要的引數由引數預設值取代。
public void Test(int numberOne, int numberOne=1, int numberThree=2) {Console.ReadLine();} 
Test(1); Test(122);
Test(1,numberThree:3);
  • 個數可變的引數
public void TestRun(params int[] data){}
TestRun(1,23,3);
public void TestRun(params object[] data){}
TestRun(1,"aa");//可以把不同型別的引數傳遞進去

(6) 建構函式

  • 與類同名的方法,但沒有返回型別;編譯器在後臺會生成預設的建構函式,把成員函式初始化為標準的預設值;
  • 靜態建構函式
    • 只執行一次,沒有訪問修飾符(public等),沒有引數;
    • 可以用來初始化靜態欄位和屬性;通常在第一次呼叫類的任何成員之前執行靜態建構函式;static Person(){//};

3 結構

  • 結構實際上是把資料項組合在一起,所以大多數字段都宣告為public。
public struct Dimensions
{
    public Dimensions(double length, double width)
    {
        Length = length;
        Width = width;
    }
    public double Length { get; }
    public double Width { get; }
}
  • 結構是值型別,但語法上常常把他們當作類來處理。new呼叫相應的建構函式,根據傳遞的引數,初始化所有欄位。
  • 結構A=B,所有內容被賦值,而對於類,只複製引用;用ref修飾結構,傳參,只傳遞結構在記憶體中的地址,但方法可改變被呼叫的結構的值。
  • C#7.2用readonly修飾只讀結構,可以生成優化的程式碼,傳遞結構體時不會複製結構的內容,會使用引用;

------------恢復內容結束------------