欄位和屬性(C )

2021-07-10 07:27:19 字數 3118 閱讀 4916

類成員預設為私有成員。如果不為類成員新增訪問修飾符,那麼預設的是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宣告的字段為靜態字段。不管包含該靜態欄位的類生成多少個物件或根本無物件,該字段都只有乙個例項,...