字段和属性的区别

今天写一个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 数据类型,且对于字符串的大小或值没有任何约束时

posted on 2018-11-27 14:46  名字还没想好  阅读(3663)  评论(2编辑  收藏  举报