c#的欄位就是指私人域(變數)
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 過程將及時計算此屬性。
類與模組之間的差異
類和模組之間的主要差異在於:類可以執行個體化為對象,而標準模組則不能。
第二部分
變數舉例:
string a="";
欄位與屬性是相對於類來說的;在類裡面把資料成員叫做欄位,通常定義為似有欄位,加存取修飾詞private,屬性是對私人欄位的封裝,供類在外部存取,對於類外部來說,只能看到屬性,不能看到私人欄位,對屬性的存取操作就是對類的私人成員的操作!
舉個例子:
class A
{
string _strName
public string strName
{
get{
return this._strName;
}
set{
this._strName=value;
}
}
}
這樣當你訪問類A的私人欄位_strName時,就可以通過strName來訪問了!
第三部分
首先 我們得知道什麼是欄位。
我們通常會記錄一些資訊 然後如何記錄呢
比如你現在要配比一個藥方 別人肯定是這麼描述的
當歸4錢 胖大海一錢……
電腦世界裡 我們要記錄這些資訊 這時候我們就需要欄位 也就是我們聲明的變數
那有人又要問了。既然有了變數 我把變數聲明成public 直接用(執行個體.變數)不就可以訪問了嗎?
為什麼還要屬性這麼多餘的東西呢?
這是因為有些東西 我們不想暴露給別人 你聲明的變數可能會給別人去用 如果別人具有隨便讀寫這個欄位的許可權 就很難保證欄位的正確和安全性
所以屬性裡可控制對欄位的讀寫權限(get是讀,set是寫) 再來談談他的正確性
如果你要記錄一個學生的數學成績(假設滿分是100)結果有人把這個記錄數學成績的欄位設定為150或者-1,那麼顯然是錯的。我們可以在屬性裡加以控制,減少這種錯誤!