欄位和屬性的區別
今天寫一個wpf的demo,用到繫結資料,給控制元件綁定了資料來源,但是資料卻沒有顯示出來,排查程式碼發現繫結資料來源的的成員用的是欄位不是屬性。
前端程式碼:
<Grid> <StackPanel Grid.Row="2" Margin="10"> <ListBox x:Name="listBox" Height="100"> </ListBox> </StackPanel> </Grid>
後臺程式碼:
public Window3() { InitializeComponent(); List<Employe> list = new List<Employe>() { new Employe() { name="jack",age=18}, new Employe() { name="bob",age=20}, new Employe() { name="alice",age=21} }; listBox.ItemsSource = list; listBox.DisplayMemberPath= "name"; listBox.SelectedValuePath = "age"; }
//實體 public class Employe { public string name { get; set; } public int age { get; set; } }
如果把Employe的name,去掉{get;set;},改為一個欄位, public string name;資料就無法綁定了。原因是屬性的訪問是由訪問器完成的,因而屬性可以進行資料繫結。
網上的文章有很多,但是好些沒說到重點,基本都是說屬性可以保護資料安全云云之類,整理了一下,有一下幾個區別:
相同點:
都是類的成員,屬性是類的屬性,而欄位是類的資料成員
不同點:
1 屬性可進行資料繫結
2 屬性可通過set和get方法進行資料安全性檢驗,而欄位不行
3 屬性可進行執行緒同步
public string Name
{
set{
lock(this)
{
}
}
}
4 屬性可以是抽象的,而欄位不行
5 屬性可以介面的形式表現
6 基於屬性的索引
7 不要直接把欄位轉化為屬性
MSDN:
屬性與欄位
屬性與欄位都可在物件中儲存和檢索資訊。它們的相似性使得在給定情況下很難確定哪個是更好的程式設計選擇。
在以下情況下使用屬性過程:
1. 需要控制設定或檢索值的時間和方式時。
2. 屬性有定義完善的一組值需要進行驗證時。
3. 設定值導致物件的狀態發生某些明顯的變化(如 IsVisible 屬性)。
4. 設定屬性會導致更改其他內部變數或其他屬性的值時。
5.必須先執行一組步驟,然後才能設定或檢索屬性時。
在以下情況下使用欄位:
1. 值為自驗證型別時。例如,如果將 True 或 False 以外的值賦給 Boolean 變數,就會發生錯誤或自動資料轉換。
2. 在資料型別所支援範圍內的任何值均有效時。Single 或 Double 型別的很多屬性屬於這種情況。
3. 屬性是 String 資料型別,且對於字串的大小或值沒有任何約束時