class A
{
int i;
public int I
{
get{....}
set{....}
}
}
其中,i是字段,I是屬性,
字段是屬於壹個類的,在類中定義(註意:是類中,而不是類中的某個方法或屬性中)
在本類中可以用
this.字段名訪問
且本類中的所有屬性、方法等都可以訪問
也就是說它的作用域是整個類。
而局部變量是屬於壹個函數或語句塊的
它的作用域是從定義開始,到離開語句塊。
C#中的變量、字段、域、屬性、屬性過程
在C#中:
域: 表示與對象或類相關聯的變量,修飾符不論是不是public。(與字段類似)
字段: 表示與對象或類相關聯的變量。通常來講修飾符是public的成員變量稱為字段,而private更適合說是局部變量。(與域類似)
屬性: 表示域或字段的自然擴展,使得在保證封裝性的基礎上實現了訪問私有成員的便捷性。
域
域表示與對象或類相關聯的變量,聲明格式如下:
attributes field-modifiers type variable-declarators;
域的修飾符field-modifiers可以是:new、public、protected、internal、private、static、readonly。實際上,域相當於C++中的簡單成員變量。在下面的代碼中,類A包含了三個域:公有的X和Y,以及私有的z。
class A
{
public int x;
public string y;
private float z;
}
字段
字段是與對象或類相關聯的變量。
當壹個字段聲明中含有static修飾符時,由該聲明引入的字段為靜態字段(static field)。它只標識了壹個存儲位置。不管創建了多少個類實例,靜態字段都只會有壹個副本。
當壹個字段聲明中不含有static修飾符時,由該聲明引入的字段為實例字段(instance field)。類的每個實例都包含了該類的所有實例字段的壹個單獨副本。
在下面的示例中,Color類的每個實例都有r,g,b實例字段的不同副本,但是Black,White,Red,Green和Blue等靜態字段只有壹個副本:
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte r, g, b;
public Color(byte r, byte g, byte b) {
this.r = r;
this.g = g;
this.b = b;
}
}
如示例所示,通過readonly修飾符聲明只讀字段。給readonly字段的賦值只能作為聲明的組成部分出現,或者在同壹類中的實例構造函數或靜態構造函數中出現。
屬性
為了類的封裝性,壹般是把字段設為Private, 把屬性設為公有來操作字段。
屬性(property)是字段的自然擴展,兩者都是具有關聯類型的命名成員,而且訪問字段和屬性的語法是相同的。然而,屬性與字段不同,不表示存儲位置。相反,屬性有訪問器(accessor),這些訪問器指定在它們的值被讀取或寫入時需執行的語句。
屬性的聲明類似於字段,不同之處在於屬性的聲明以定界符{}之間的get訪問器和/或set訪問器結束,而不是分號。同時包含get訪問器和set訪問器的屬性稱為讀寫屬性(read-write property)。只具有get訪問器的屬性稱為只讀屬性(read-only property)。只具有set訪問器的屬性稱為只寫屬性(write-only property)。
get訪問器相當於壹個具有屬性類型返回值的無參數方法。除了作為賦值的目標外,當在表達式中引用屬性時,會調用該屬性的get訪問器以計算該屬性的值。
set訪問器相當於壹個具有單個名為value的參數和無返回類型的方法。當壹個屬性作為賦值的目標,或者作為++或--運算符的操作數被引用時,就會調用set訪問器,所傳遞的自變量將提供新值。
List類聲明了兩個屬性Count和Capacity,依次是只讀和只寫的。下面是使用這些屬性的示例:
List names = new List();
names.Capacity = 100; //調用set訪問器
int i = names.Count; //調用get訪問器
int j = names.Capacity; //調用get訪問器
與字段和方法類似,對於實例屬性和靜態屬性,C#兩者都支持。靜態屬性是聲明中具有static修飾符,而實例屬性則沒有。
屬性的訪問器可以是虛擬的。當屬性聲明中包含virtual,abstract,override修飾符時,它們將運用到屬性訪問器。
來自MSDN中的內容:
屬性與字段
屬性與字段都可在對象中存儲和檢索信息。它們的相似性使得在給定情況下很難確定哪個是更好的編程選擇。
在以下情況下使用屬性過程:
1. 需要控制設置或檢索值的時間和方式時。
2. 屬性有定義完善的壹組值需要進行驗證時。
3. 設置值導致對象的狀態發生某些明顯的變化(如 IsVisible 屬性)。
4. 設置屬性會導致更改其他內部變量或其他屬性的值時。
5.必須先執行壹組步驟,然後才能設置或檢索屬性時。
在以下情況下使用字段:
1. 值為自驗證類型時。例如,如果將 True 或 False 以外的值賦給 Boolean 變量,就會發生錯誤或自動數據轉換。
2. 在數據類型所支持範圍內的任何值均有效時。Single 或 Double 類型的很多屬性屬於這種情況。
3. 屬性是 String 數據類型,且對於字符串的大小或值沒有任何約束時。
Visual Basic中屬性和變量的差異(在C#中應該也是壹樣的)
變量和屬性都表示可以訪問的值。但在存儲和實現方面有所不同。
變量
變量 直接對應於內存位置。可以使用單個聲明語句定義變量。變量可以是“局部變量”,在過程中定義且僅可用於該過程;它也可以是“成員變量”,在模塊、類或結構中定義,但不在任何過程中定義。成員變量又稱“字段”。
屬性
屬性 是在模塊、類或結構中定義的數據元素。使用 Property 和 End Property 語句之間的代碼塊定義屬性。此代碼塊包含壹個 Get 過程t或壹個 Set 過程,或兩者都包含。這兩個過程稱為“屬性過程”或“屬性訪問器”。除了檢索或存儲屬性的值外,它們還可以執行自定義操作,如更新訪問計數器。
不同點
下表指出了變量和屬性之間的壹些重要差異。
差異點 變量 屬性
聲明 單個聲明語句 代碼塊中的壹系列語句
實現 單個存儲位置 可執行代碼(屬性過程)
存儲 直接與變量的值關聯 通常包含內部存儲;在屬性的包含類或模塊外部,這些內部存儲不可用屬性的值可能作為也可能不作為壹個存儲元素(見下(1))
存在可執行代碼 無 至少必須有壹個過程
讀寫訪問權限 讀/寫或只讀 讀/寫、只讀或只寫
自定義操作 不可能 可以當作部分設置或檢索屬性值執行
註解:(1)和變量不同,屬性的值可能不直接對應於單個存儲項。為方便或安全起見,存儲可能拆分為幾塊;也可能以加密格式存儲值。在這些情況下,Get 過程將匯編這些塊或解密存儲值,然後 Set 過程會加密新值或將其拆分到構成存儲的各個組成部分中。屬性值可以是臨時的,如壹天中的某個時間,在這種情況下,每次訪問此屬性時,Get 過程將及時計算此屬性。
類與模塊之間的差異
類和模塊之間的主要差異在於:類可以實例化為對象,而標準模塊則不能。