標籤:程式 記憶體 使用方法 const alt 使用 title protected common
常量:指在程式編譯時間已經存在且在程式生命週期內不會發生改變的值,用const定義一個常量。
private class TestA --定義一個類時後邊不加()
{
private const double Pi=3.14;
private double GetPi() --輸出pi值得方法,後邊帶()
{
double t=pi;
return t;
}
}
變數:
變數本身被用來儲存特定類型的資料,可以根據需要隨時改變變數中所儲存的資料值。變數具有名稱、類型和值。變數名是變數在程式原始碼中的標識。變數類型確定它所 代表的內 存的大小和類型,變數值是指它所代表的記憶體塊中的資料。在程式的執行過程中,變數的值可以發生變化。使用變數之前必須先聲明變數,即指定變數的類型和 名稱。
變數可以儲存實值型別,也可以儲存參考型別
實值型別變數:直接儲存其資料值,主要包括整數類型,浮點類型和布爾類型。
實值型別變數在堆棧中進行分配,因此效率很高,使用實值型別主要目的是為了提高效能,主要分為以下3種實值型別。
(1)整數類型
(2)浮點類型
(3)布爾類型
參考型別變數:儲存的是其資料值得引用,參考型別變數可以引用同一對象,這種情形下,對一個變數的操作會影響另一個變數所引用的同一對象。 u參考型別被賦值前的 值都是null。
實值型別和參考型別的區別:
public class Test
{
public int a=3; --實值型別變數
string ss="1234455":
public string sq=ss; --參考型別變數
}
在變數類型後添加“?”表示可空實值型別。
例如:
into a=null;
以上代碼VS會提示錯誤:無法將 Null 轉換成 “int” ,因為它是一種不可以為 null 值的類型。
但寫成以下格式就不會報錯了:
int? a=null;
實值型別直接儲存其值,而參考型別儲存對其值得引用。實值型別儲存在記憶體的棧中,而參考型別在記憶體的堆中存在對值得引用地址。
欄位,屬性
欄位是構成類結構的一種元素,它不僅可以用C#內建類型進行聲明,也可以用任意的自訂類型進行聲明,很明顯,它不僅可以儲存一個實值型別的執行個體,也可以儲存一個參考型別的地址引用。欄位可以直接定義在類或結構中。相比常量,它就多了一些特性,它不僅可以是類的狀態資料,也可以是執行個體的狀態資料,它預設並不是static,而是對象級的成員,除非明確指定其修飾符為static。欄位可以使用的修飾符為: public、private、protected、internal 或 protected internal。另外,readonly也可以用於欄位,如果再加上satic,此時它就相當於常量了,只不過對象級的欄位初始化是在建構函式中進行的,類級的欄位初始化是在靜態建構函式中進行的。如下代碼:
public class Code_03 { public const double PAI = 3.14; double radius = 20; static int a = 10; static readonly int b = 30; }
常量是在編譯時間計算,欄位是在運行時計算,
const常量在聲明處進行初始化,編譯時間直接將值編譯進中繼資料,運行時不能進行值更改(如下面代碼中的PAI)。
執行個體欄位可在定義處和建構函式內進行初始化。可在任意處變更,如果其可訪問性允許(如下面代碼中的radius)。
static 欄位聲明為類級的欄位,它屬於類的狀態資料。可在任意處變更,如果其可訪問性允許(如下面代碼中的a)。
readonly 欄位聲明唯讀欄位,只能在建構函式內對其變更(如下面代碼中的b)。
static readonly 欄位聲明靜態唯讀欄位,它屬於類級且唯讀。只能在靜態建構函式內對其更改(如下面代碼中的c)。
1 public class Code_03 2 { 3 public const double PAI = 3.14; 4 double radius = 20; 5 static int a = 10; 6 readonly int b = 0; 7 static readonly int c = 30; 8 9 static Code_03()10 {11 a = 100;12 c = 1000;13 //錯誤 非靜態欄位、方法或屬性“ConsoleApp.Example03.Code_03.c”要求對象引用 14 //radius = 1;15 //b = -1;16 }17 public Code_03()18 {19 radius = 1;20 a = -1;21 b = -1;22 //錯誤 無法對靜態唯讀欄位賦值(靜態建構函式或變數初始值中除外)23 //c = -1;24 }25 public void MyMethod()26 {27 radius = 1;28 a = -1;29 //錯誤 無法對靜態唯讀欄位賦值(靜態建構函式或變數初始值中除外)30 //b = -1;31 //c = -1;32 }33 }View Code
屬性:
欄位通常儲存著類或對象本身的狀態,我們當然可以將其公開為public讓外界對其進行讀、寫修改。從某種意義上來講,我們更希望在類本身內部對自己的狀態進行維護,並不希望外界對自己的狀態進行直接更改,以防止破壞這些資料,所幸的是還有一個資料成員可供使用,它就是屬性。
如果在外部要訪問某一個類的內部成員(私人欄位),可以使用方法來達到目的,但如果對每一個欄位都去編寫一個方法來進行讀寫操作似乎又麻煩了些。屬性以靈活的方式實現了對私人欄位的訪問,它是一種“訪問器”方法,包括get方法和set方法,更明確地說,屬性就是方法的精簡寫法的實現,隱藏了實現和驗證的代碼。它有兩個訪問器:
get訪問器用於擷取屬性的值。
set訪問器用於設定屬性的值。既然它是方法,且是要在方法內對私人欄位用新值變更替換,那麼它就是可以(或者說是應該)接收參數的, value 關鍵字就是用於定義由 set 存取子分配的值。假如有如下一個屬性的定義:
public class Code_03_2 { string _name; public string Name { get { return _name; } set { _name = value; } } }View Code
這個定義是通過屬性Name對私人欄位_name進行訪問
我們已經看出來,屬性是方法的實現,既然是方法,那方法就可以被存取修飾詞定義,如public、private等,來限定方法的可訪問性,很顯然,我們也可以對屬性的可訪問性進行限定,這裡是對訪問器set和get進行訪問限定的
屬性還有一種更簡潔的寫法如下:
public int Age { get; set; } public string Address { get; set; }
在編譯的時候,編譯器會自動產生對應的私人欄位_age和_address,同樣也會產生相應的get_方法和set_方法。
方法,函數
在瞭解方式之前我們應該先瞭解一下類和對象
類:具有共同屬性和行為的的同一類事物的集合,如人類,電腦類
對象:對類的執行個體化成為對象,如人類中的張三,就是類的一個對象
定義一個人類,有Name和age屬性public class Person{ public string _name; pbublic string Name { get{this.Name=_name;} set{_name=value;} } public string _age; public string Age { get{this.Age=_age;} set{_age=value;} }}View Code
上邊的代碼是定了一個人類,有姓名和年齡這兩個屬性
那麼張三是怎麼出來的呢?
執行個體化:
Person person =New Person();
person.Name=‘張三‘;
person.Age=20;
(也可以簡寫為:Person person=new Person(){Name=‘張三‘,Age=20};)
這樣就實話化出了一個人類的對象,張三
而方法 就是這些人類的可以做的行為,定義在類的內部,如張三可以喝水,生孩子
public class Person{ // 屬性和欄位的簡寫 在編譯時間聲稱Name的欄位和get set 方法 public string Name{get;set;} public int Age{get;set;} public string Heshui() { string Name=this.Name; return Name+"可以喝水"; } }View Code
Person person=new Person(){Name=‘張三‘,Age=20};
person.heshui();
heshui就是Person類的一個方法,執行個體化一個對象之後就可以調用heshui()這個方法了。
常量,變數,方法等一般都有存取修飾詞來限制存取權限
常用的存取修飾詞有:
private:私人成員,在類的內部可以訪問
public:公用成員,完全公開,沒有訪問限制
protected:保護成員,在類的內部和繼承類中可以訪問
internal:在同一命名空間內可以訪問
C# 常量,變數,欄位,屬性,方法