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--类型的那些事

原文地址:https://www.cnblogs.com/facingwaller/p/advance_in_csharp_about_pro6.html