zoukankan      html  css  js  c++  java
  • 字段和属性的区别

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

  • 相关阅读:
    《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法
    8 张脑图入门 JavaScript
    Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决
    Spring boot 多模块项目 + Swagger 让你的API可视化
    Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版
    JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架)
    SSM 项目从搭建爬坑到 CentOS 服务器部署
    LeetCode
    有趣的位运算
    记一次向maven中央仓库提交依赖包
  • 原文地址:https://www.cnblogs.com/Serialport/p/10008725.html
Copyright © 2011-2022 走看看