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 {  get set ; } 
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
 

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

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值