zoukankan      html  css  js  c++  java
  • c#进阶理解property属性和属性值之惑

    目录

    1 简单demo 

    2 使用reflactor分析

    3 使用属性的提醒 

    4 我对属性的理解

    5 属性需要定位吗? 

    6 扩展阅读 

     1 简单demo

    以下是一个常见的属性的使用。其中Name 属性没有定义私有字段,而AGE定义了已有字段。

    public sealed class Employee { 
    // This property is an automatically implemented property 
    public String Name { getset; } 
    private Int32 m_Age; 
    public Int32 Age { 
    get { return(m_Age); } 
    set { 
    if (value < 0// The 'value' keyword always identifies the new value. 
    throw new ArgumentOutOfRangeException("value", value.ToString(), 
    "The value must be greater than or equal to 0"); 
    m_Age 
    = value; 


    }

    2使用reflactor分析

    public sealed class Employee
    {
        
    // Fields
        [CompilerGenerated]
        
    private string <Name>k__BackingField;
        
    private int m_Age;

        
    // Methods
        public Employee()
        {
            
    base..ctor();
            
    return;
        }

        
    // Properties
        public int Age
        {
            
    get
            {
                
    int CS$1$0000;
                CS$
    1$0000 = this.m_Age;
            Label_000A:
                
    return CS$1$0000;
            }
            
    set
            {
                
    bool CS$4$0000;
                
    if (((value < 0== 0!= null)
                {
                    
    goto Label_0023;
                }
                
    throw new ArgumentOutOfRangeException("value"&value.ToString(), "The value must be greater than or equal to 0");
            Label_0023:
                
    this.m_Age = value;
                
    return;
            }
        }

        
    public string Name
        {
            [CompilerGenerated]
            
    get
            {
                
    string str;
                str 
    = this.<Name>k__BackingField;
            Label_0009:
                
    return str;
            }
            [CompilerGenerated]
            
    set
            {
                
    this.<Name>k__BackingField = value;
                
    return;
            }
        }
    }
    Collapse Methods
    image 

    我们可以看到他自动生成了:

    1 SET 方法

    2 Get方法

    3使用属性的提醒:

    1  属性可以是只读或者只写或读写皆可,而字段通常是可读可写。

    2 对属性赋值或取值时可以进行逻辑处理,而字段不可用。

    3 属性不能Ref 和Out ,字段可以。

    4 属性的读取可能花费较长时间,总是比字段长。在一些需要更快的读写的场合可以使用字段。

    5 在一行代码中多次调用属性可能不一样。如取时间。听说这是MS的一个败笔。

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

    4我对属性的理解:

    属性与字段的异同:

       相同:都是表示类的一个数据(如人的身高、体重等)。

       不同:属性对外部和派生类开放。这也解释了为什么需要加逻辑验证。

                    字段对内部开放。提供更快的性能,更少的验证,信任程序员。

    5 属性需要定位吗?

    用以上的准则为指导。那么遇到下面的情况又该怎么办?

    public sealed class Good {
          // This property is an automatically implemented property
          public Int32 Guality { get; set; }
          private Int32 _price;
          public Int32 Price {
              get { return (_price); }
              set {
                  if (value < 0) // The 'value' keyword always identifies the new value.
                      throw new ArgumentOutOfRangeException("value", value.ToString(),
                      "The value must be greater than or equal to 0");
                  _price = value;
              }
          }

          //性价比
          public Int32 CostPerformance {
              get {
                  return Guality / _price;
              }
          }

      }

    属性的定位应该是怎么样?什么时候用属性?性价比算是他的一个数据吗?应该是使用方法的形式还是属性的形式?如果是以属性的方式提供那么他不是与方法的定位冲突了吗?

    欢迎讨论!

    6扩展阅读

    Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。

    C#中属性的一个容易搞错的问题 即:SET和GET的不一定一样

    C#中的属性

    第三回:历史纠葛:特性和属性

    属性(C# 编程指南)


    系列索引

     C#功能派的进阶2--类型的那些事

  • 相关阅读:
    HDU2519(组合数计算)
    CodeForces
    UVA 10976(暴力)
    UVA 11059(暴力)
    UVA725
    配置三层交换机DHCP
    通过三层交换机不同vlan之间通信
    AGC006C & CF1110E
    多项式全家桶
    一些模板(持续更新中)
  • 原文地址:https://www.cnblogs.com/facingwaller/p/advance_in_csharp_about_pro6.html
Copyright © 2011-2022 走看看