類成員預設為私有成員。如果不為類成員新增訪問修飾符,那麼預設的是private。
公共成員需要顯式指定。
欄位和屬性是不同的兩個概念:
欄位是類中實打實的一種變數。用來儲存與物件相關聯的資料。所以當欄位規定為public時,在當前類之外其他類中 隨
時隨地訪問和修改字段值(只要定義好當前類的例項即可,除static外),也就是類中所有的細節都能看的很清
楚。這符合封裝
的思想,但卻不是徹底的封裝,因為它
並不安全。
所以我們又可以規定欄位的訪問修飾符為private,這樣只有在當前類中可以訪問,在類之外的其他類就訪問和修改不
到了。
但是以上又引申出兩個方面的問題:
1.private封裝的太過徹底,public開放的太大,而當我們需要規定字段唯讀或者只寫怎麼辦?
2.我們可以在類之外看到類中有哪些字段,知道類中具體的欄位名是什麼,這不符合安全原則。
為了解決以上問題,當然可以將所有字段設定為private,再專門為每個字段提供公共取值和賦值方法用於訪問和修改
它們的值。但是這樣的代價是我們無法再使用賦值操作符設定類中的字段資料(即我們不能用類的例項.欄位名 =
值來設定),必須呼叫對應的方法來訪問修改字段資料。
因此才最終推導出屬性這個東西。
c#本質論的書上說,屬性的關鍵特點是,提供了從程式設計角度看類似於字段的api(個人認為這句話最為貼切屬性的作用
和含義)。
不懂屬性到
底是什麼或者只知道用卻不去深究其與字段關係的,看到這句話多少會有些豁然開朗的感覺。
屬性有哪些好處呢:
1.解決直接能看出類中欄位名的弊端。類的欄位名如果是_phonenumber,那麼對應的屬性名可以定義為phonenumber。
我們在類
之外的其他類中,可以通過類的例項.phonenubmer來進行賦值和訪問字段資料,但是其實真正的欄位名是_phonenumber,但
事實上呼叫的人並不知道。
2.我們又可以用賦值操作符進行訪問和修改類的成員資料。
3.定義唯讀只寫屬性更為方便。
4.利用屬性可以提供屬性驗證,在將value賦給字段之前,可以攔截賦值,先對其進行驗證。
在實際程式設計過程中,要一直使用屬性,不要直接呼叫字段。要不然屬性還有毛線意義。
另外屬性不能作為ref和out參
數。對於唯讀屬性,利用類構造器依舊不可以對其進行賦值,只能通過字段初始化賦值。
屬性可以作為虛字段使用。即可以讓屬性取值方法返回計算好的值,讓賦值方法解析值,解析的值存到其他成員字段
中,而屬性本身並沒有實質的意義。
請看下面乙個例子:
public propertyexample()
",phone.brand);
phone.phonenubmer = "123456789";
txtblk2.text = string.format("手機號碼是:", phone.phonenubmer);
//錯誤,無法為屬性phonetype賦值,因為它是唯讀的
//對於唯讀屬性,我們只能利用欄位對其進行賦初始值
= "lumia 950xl";
txtblk3.text = string.format("手機型號是:", phone.phonetype);
phone.phonesdsize = "64gb";
//錯誤,因為屬性phonesdsize是只寫的,不能讀取值;所以就功能上來說只寫的情況是很罕見的
//只寫的屬性一般你進行了賦值卻不能最終輸出獲取到屬性值,所以比較少見
= string.format("手機sd卡容量:", phone.phonesdsize);
//雖然給屬性phoneprice設定了get,set,但是set用private修飾符修飾,那麼在類的外部set訪問器便不可訪問
= "3599";
phone.makeprice("3599");
txtblk4.text = string.format("手機**是:",phone.phoneprice);
txtblk5.text = string.format("手機螢幕尺寸:", phone.phonescreensize);
phone.phonescreensize = "5.7";
txtblk6.text = string.format("修改後的手機螢幕尺寸:", phone.phonescreensize);
}//以下屬性只用於說明問題,與屬性字面意義並無掛鉤,無需糾結
class phone
set}
//屬性第二種定義方法
public string phonenubmer
//唯讀屬性(只能通過賦初始值的方式賦值,並不能通過類構造器賦值)
private string _phonetype = "lumia 1320";
public string phonetype
}//只寫屬性
private string _phonesdsize;
public string phonesdsize
}//為屬性的取值方法和賦值方法指定訪問修飾符
//賦值方法指定private修飾符後,phoneprice屬性在phone類內部是可讀可寫的,在phone類之外唯讀
private string _phoneprice;
public string phoneprice
private set
}//因為類的所有成員包括方法,都是預設私有的
//所以在要決定**的函式必須明確指定為public才能在類的外部被呼叫
//也可以利用類的構造器對屬性進行賦值,因為在類內部屬性phoneprice可讀可寫(跟唯讀屬性比較)
public void makeprice(string price)
//對欄位進行初始化賦值
private string _phonescreensize = "5.5";
public string phonescreensize
set}
}
結果截圖:
C 字段,屬性和屬性封裝字段
c 類成員包括 字段,屬性和方法。對於日常對於乙個類我們新增成員時會有幾種方法。如對於乙個person 類,我們對於其中乙個成員 性別 gender 進行定義,可以寫成 1,public string gender 2,public string gender 3,private string ge...
c 欄位和屬性
一 字段 field 可以在宣告欄位的同時賦給它乙個初始值。二 屬性 property 1 引入 假如將字段宣告為public,則在類的外部都可以對該字段進行訪問和更改,違背了類的封裝特性。如果宣告為private,則這種形式的封裝通常又過於徹底。例如,你可能希望欄位從外部唯讀,但從內部可以更改,但...
C 欄位和屬性
一般吧類或結構中定義的變數和常量叫字段。字段分為 靜態字段,例項字段,常量欄位和唯讀字段。常量字段 用const修飾符宣告的字段為常量,常量只能在宣告中初始化,以後不能再修改。靜態字段 用修飾符static宣告的字段為靜態字段。不管包含該靜態欄位的類生成多少個物件或根本無物件,該字段都只有乙個例項,...