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

    转自博客园某博,原地址。。。。。

    首先从两者的声明上来看,公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装,它使用get和set访问器来控制如何设置或返回字段值。

    由于属性的实质是方法(类似Java中的get或set方法),在IL中是没有属性的概念的。所以对于开发过程中常用的赋值和取值操作来说,使用公共变量肯定会比使用属性速度要快,性能上也稍高(方法和变量哪个速度不用说了吧)。

    公共字段虽然在速度上快,但它必须开放字段为public,这样一来对象的调用者便可以直接修改其值,值的内容是否合法,运行中是否会出错,就没有了保障,进而会大大降低类的可重用性;相反,属性类似于方法,它可以对存入的变量的值进行处理,如果觉得该值不合法,可以就地变换或者直接提出警告。这对该类的对象的使用安全有很大好处,在运行过程中,因公共变量值的错误而产生的问题会大大减少。

    从上述内容来看,两者各有优缺点,在实际项目开发过程中,我们究竟选择使用哪一种方式呢?

    如果满足下面几个条件,那么我们便可以大胆地使用公共字段:
    1. 允许自由读写;
    2. 取值范围只受数据类型约束而无其他任何特定限制;
    3. 值的变动不需要引发类中其它任何成员的相应变化;
    属性的使用条件则恰好跟变量相反,只要满足下面任何一个条件,就应该使用属性:
    1. 要求字段只能读或者只能写;
    2. 需要限制字段的取值范围;
    3. 在改变一个字段的值的时候希望改变对象的其它一些状态;

    总结:虽然在实际项目的开发过程中,公共字段和属性在合适的条件下都可以使用,但是我们应该尽可能的使用属性(property),而不是数据成员(field);把所有的字段都设置为私有字段,如果要暴露它们,则把它们封装成属性,这也是微软推荐的方式。

     

    其他的资料:

    MSDN:属性是这样的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。

    MSDN的用例:

    class TimePeriod
    {
        private double seconds;
    
        public double Hours
        {
            get { return seconds / 3600; }
            set { seconds = value * 3600; }
        }
    }
    
    
    class Program
    {
        static void Main()
        {
            TimePeriod t = new TimePeriod();
    
            // Assigning the Hours property causes the 'set' accessor to be called.
            t.Hours = 24;
    
            // Evaluating the Hours property causes the 'get' accessor to be called.
            System.Console.WriteLine("Time in hours: " + t.Hours);
        }
    }
    // Output: Time in hours: 24
    

    自动属性额一些性质:

    在 C# 3.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。 客户端代码还可通过这些属性创建对象。 如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问。

    // This class is mutable. Its data can be modified from
    // outside the class.
    class Customer
    {
        // Auto-Impl Properties for trivial get and set
        public double TotalPurchases { get; set; }
        public string Name { get; set; }
        public int CustomerID { get; set; }
    
        // Constructor
        public Customer(double purchases, string name, int ID)
        {
            TotalPurchases = purchases;
            Name = name;
            CustomerID = ID;
        }
        // Methods
        public string GetContactInfo() {return "ContactInfo";}
        public string GetTransactionHistory() {return "History";}
    
        // .. Additional methods, events, etc.
    }
    
    class Program
    {
        static void Main()
        {
            // Intialize a new object.
            Customer cust1 = new Customer ( 4987.63, "Northwind",90108 );
    
            //Modify a property
            cust1.TotalPurchases += 499.99;
        }
    }
    
  • 相关阅读:
    js在当前时间上加分钟数得到新的时间
    (转)@Autowired(required=false)注入注意的问题
    Java代替if和switch的方法(记录一下)
    windows下RocketMQ的安装部署
    RocketMQ在windows环境下的安装(转)
    简单说下二维数组
    JAVA-单例模式的几种实现方式
    (转)mybatis一级缓存二级缓存
    MySql安装后在服务管理器里边找不到MySql服务项的解决办法(win10)
    JAVA字符串的替换replace、replaceAll、replaceFirst的区别解析。
  • 原文地址:https://www.cnblogs.com/kiwi/p/2441168.html
Copyright © 2011-2022 走看看