C 基礎 索引器,靜態類,值型別和引用型別

2021-07-03 04:28:07 字數 4351 閱讀 1316

1索引器

索引器的目的就是為了方便而已,可以再該型別的物件後面直接加一對就能訪問該型別中的成員內容了。

class program

itcastclass ic = new itcastclass();

ic[0] = "aaaa";

for (int i = 0; i < ic.namelength; i++)

console.readkey();}}

public class myclass

;public int length

}//索引器最終編譯的的時候會生成乙個名字叫item的屬性

public string this[int index]

set}

//public string item//}

public class person

}set}}

public object this[string key]

}set}}

private string _name;

private string _email;

}

2,訪問修飾符

作用:指明程式的其他部分如何訪問該成員。共5種

private 當前類中可以訪問,類中成員的預設訪問修飾符

protected  當前類和子類可以訪問(在繼承中用)

internal  當前程式集內部可以訪問,類如果不加訪問修飾符,則預設為internal

protected internal 當前程式集或子類中(不同程式集也可以訪問)

public 任何地方

訪問級別約束

1)子類的訪問級別不能比父類高(會暴漏父類的成員)

2)類中屬性或字段的訪問級別不能比所對應的型別訪問級別高

3)方法的訪問級別不能比方法的引數和返回值的訪問級別高

3,靜態類和靜態成員

靜態成員是與「類」相關,而非「例項相關」。

普通類中的靜態成員static:只能通過類名訪問,靜態方法中只能訪問靜態成員,或通過物件訪問例項成員,多個物件共享同乙個靜態成員

靜態類:一般都用作工具類,裡面都是一些工具函式,靜態類中只包含靜態成員,靜態建構函式不能有引數,不能有訪問修飾符(預設private)靜態建構函式在第一次使用該靜態類的時候只執行一次。

靜態成員屬於類所有,非靜態成員屬於類的例項所有

c#靜態方法屬於所有類,類例項化前即可使用。在例項方法中可以直接呼叫靜態方法,在靜態方法中不能直接呼叫例項方法。

靜態方法和靜態變數建立後始終使用同一記憶體塊(靜態儲存區),而例項的方法會建立多個記憶體。

靜態類和靜態成員在程式中的任何乙個地方都可以訪問,不會因為超出了方法的作用域而不能訪問,所以靜態類和靜態成員只有在程式退出的時候才會釋放資源

靜態類不能被例項化,就不會由物件,而this表示的是當前物件,所以靜態類中不能使用this

靜態和非靜態的區別:

1)、在非靜態類中,既可以有例項成員,也可以有靜態成員。2)、在呼叫例項成員的時候,需要使用物件名.例項成員;

在呼叫靜態成員的時候,需要使用類名.靜態成員名;

總結:靜態成員必須使用類名去呼叫,而例項成員使用物件名呼叫。 靜態函式中,只能訪問靜態成員,不允許訪問例項成員。 例項函式中,既可以使用靜態成員,也可以使用例項成員。靜態類中只允許有靜態成員,不允許出現例項成員。

什麼時候用靜態類:

1>在整個應用程式中要共享某些資料的時候可以使用靜態類。

2>靜態類不能建立物件,使用的時候直接通過類名來操作成員,(使用方便),所以說對於那些類中包含有大量的方法,並且類不需要建立物件的時候,可以使用靜態類。 靜態

非靜態static關鍵字

不需要static關鍵字

使用類名呼叫

使用例項物件呼叫

在靜態方法中可以訪問靜態成員

在例項方法中,可以直接訪問靜態成員

在靜態方法中不可以直接訪問例項成員

在例項方法中可以直接訪問例項成員

呼叫前初始化

例項化物件時初始化

4,值型別和引用型別

值型別:int    char    double   floatlongshortbyteboolenumstructdecimal

值型別都是隱式繼承自valuetype,值型別不能繼承,只能實現介面,存放在棧中。

引用型別:string陣列類介面委託 

引用型別都派生自system.object,引用型別可以繼承。 存放在堆中。

ref把值型別改為引用型別

區別:1、值型別和引用型別在記憶體上儲存的地方不一樣。

2、在傳遞值型別和傳遞引用型別的時候,傳遞的方式不一樣。

結構中不能有顯示無參建構函式(隱式),結構中不能給字段賦初始值。

值型別和引用型別作為引數    引用傳遞

class program

;m6(ref arrint);

//0000000

for (int i = 0; i < arrint.length; i++)

int arrint1 = new int ;

m7(ref arrint);

//12345678

for (int i = 0; i < arrint1.length; i++)

#region myregion

console.readkey();

#endregion

}// 值型別 與 引用型別 作為引數 【引用傳遞】

private static void m7(ref int arrint)

}private static void m6(ref int arrint)

}private static void m5(ref string name2)

private static void m4(ref person p1)

private static void m3(ref person p1)

private static void m2(ref person p1)

//值傳遞,傳遞的是棧中的內容,(對於值型別,棧中的內容就是對應的資料。對於引用型別棧中內容就是物件的位址)

//引用傳遞,傳遞的是棧本身的位址,多個變數名實際上指向的是同乙個棧變數。

//引用傳遞必須使用ref關鍵字修飾。在方法呼叫的時候傳遞引數的時候也必須加ref 關鍵字

private static void m1(ref int m)

}class person

}

值型別 與引用型別 作為引數       值傳遞

class program

;m6(arrint);

//12345678

for (int i = 0; i < arrint.length; i++)

int arrint1 = new int ;

m7(arrint1);

//100,100,100,100,100,100,100,100

for (int i = 0; i < arrint1.length; i++)

console.readkey();

}#region 值型別 與 引用型別 作為引數 【值傳遞】

//值傳遞:

private static void m7(int arrint)

}private static void m6(int arrint)

}private static void m5(string name2)

private static void m4(person p1)

private static void m3(person p1)

private static void m2(person p1)

private static void m1(int m)

}

值型別和引用型別的區別

1.將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不複製物件本身。

2.值型別不可能派生出新的型別:所有的值型別均隱式派生自

system.valuetype

。但與引用型別相同的是,結構也可以實現介面。

3.值型別不可能包含

null

值:4.

每種值型別均有乙個隱式的預設建構函式來初始化該型別的預設值。 

然而可空型別功能允許將null賦給值型別。

堆和棧的區別

棧是編譯期間就分配好的記憶體空間,因此你的**中必須就棧的大小有明確的定義;區域性值型別變數、值型別引數等都在棧記憶體

中。堆是程式執行期間動態分配的記憶體空間,你可以根據程式的運**況確定要分配的堆記憶體的大小。

c 基礎值類和引用型別

值型別 int double char decimal bool enum struct 引用型別 string 陣列 自定義類 集合 object 介面 值傳遞傳遞的值得本身 引用傳遞傳遞的是對物件的引用 ref 將值傳遞改變為引用傳遞 值傳遞和引用傳遞 int n1 10 int n2 n1 n...

c 基礎 值型別和引用型別

c 中有兩種型別的資料,一種是值型別資料,一種是引用型別資料。首先說說什麼型別是值型別,例如 int float bool之類的基礎型別,以及用struct定義的型別,如 datetime。除此外,如string,陣列,以及用class定義的型別等都是引用型別。具體對比如下 值型別引用型別 記憶體分...

C 基礎 值型別和引用型別

struct型別 由一系列具有相同型別或不同型別的資料構成的資料集合 static void main string args struct person enmu型別 使用關鍵字const建立常量,建立常量時必須設定其初始值,一旦設定不允許修改。char只定義乙個unicode字元 string類...