新的C#语言特性:自动属性(Automatic Properties)

新的C#语言特性:自动属性(Automatic Properties)

如果你现在是C#开发人员的话,你大概非常习惯编写象下面这个代码片段一样带有基本属性的类型:

 

     public class  Person {

        
private string  _firstName ;
        private string 
_lastName ;
        private int 
_age ;
        
        public string 
FirstName {

            
get  {
                
return  _firstName ;
            
}
            
set  {
                _firstName 
= value;
            
}
        }

        
public string  LastName {

            
get  {
                
return  _lastName ;
            
}
            
set  {
                _lastName 
= value;
            
}
        }        
        
        
public int  Age {

            
get  {
                
return  _age ;
            
}
            
set  {
                _age 
= value;
            
}
        }
    }

 

注意,我们在属性的geter/setter中实际上并没有添加什么逻辑,我们只是将get/set实施到了一个成员变量。我们不禁要问这样一个问题:为什么不直接使用成员变量而使用属性呢?这是因为,向外面呈现公开的成员变量有很多不好的地方。二个最大的问题是:1) 你无法轻易地对成员变量做数据绑定,2) 如果你从类中向外呈现成员变量的话,之后,你不重新编译那些引用老的类的任何程序集,就无法将它们改成属性(譬如,要添加验证逻辑到setter里)。

Orcas中发布的新C#编译器通过一个叫“自动属性(automatic properties)”的语言特性提供了一个优雅的方式来使得你的编码更加简洁,同时还保持属性的灵活性。自动属性允许你避免手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作。

譬如,使用自动属性,我现在可以将上面的代码改写成:

 

     public class  Person {
    
        
public string  FirstName {
            
get; set;
        
}

        
public string  LastName {
            
get; set;
        
}        
        
        
public int  Age {
            
get; set;
        
}
    }

 

或者,我想更简明的话,我可以将空白的地方做进一步压缩,象这样:

 

     public class  Person {
        
public string  FirstName {  get; set;  }
        
public string  LastName  {  get; set;  }        
        
public int    Age       {  get; set;  }
    }

 

当Orcas版中的C#编译器遇上象上面这样的空的get/set属性的话,它会自动为你在类中生成一个私有成员变量,对这个变量实现一个公开的getter 和setter。这么做的好处是,从类-合同(type-contract)的角度来看,这个类跟我们上面第一个有点冗长的实现看上去完全一样,这意味着,不象公开的成员变量,在将来,我可以在我的属性setter实现中添加验证逻辑,而不用对引用我的类的任何外部组件做改动。

Bart De Smet对使用Orcas三月份CTP版中的自动属性时内部发生的情形作了精彩的描述,你可以在这里阅读他的精彩相关帖子

C#和VB语言的新特性:对象初始化器(Object Initializers)

.NET框架中的类型非常依赖于属性的使用。当生成对象实例和使用新的类型时,写出象下面这样的编码是非常常见的情形:

 

    Person person  = new  Person() ;
   
person.FirstName  "Scott" ;
   
person.LastName  "Guthrie" ;
   
person.Age  32 ;

 

你有没有想要把这样的编码简化过(也许将其安排在一行上)?使用Orcas中的C#和VB语言编译器的话,你现在可以利用一个称为“对象初始化器(object Initializers)”的“语法甜头(syntactic sugar)”语言特性来做些简化,将上述代码重写为:

 

   Person person  = new  Person { FirstName = "Scott" , LastName = "Guthrie" , Age = 32  } ;

 

然后,编译器就会自动地生成合适的属性setter代码,保持跟前面较冗长的代码例子同样的语意。

除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型。譬如,假如我们在上面定义的每个Person类型也拥有一个属于Address类型的叫“Address”的属性。我们可以编写下面这样的代码来生成一个新的Person对象,同时设置它的属性,象这样:

 

    Person person  = new  Person {
      FirstName 
"Scott" ,
      LastName 
"Guthrie"
      
Age  32 ,
      Address 
= new  Address {
         Street 
"One Microsoft Way" ,
         City 
"Redmond" ,
         State 
"WA" ,
         Zip 
98052
      
}
   }
;

 

Bart De Smet对使用Orcas三月份CTP版中的对象初始化器时内部发生的情形也作了精彩的描述,你可以在这里阅读他的精彩相关帖子

C#和VB语言的新特性:集合初始化器(Collection Initializers)

对象初始化器很棒,它极大地简化了把对象添加到集合的做法。譬如,假如我要把三个人加到一个基于泛型的类型为Person的List集合中去的话,我可以写下面这样的编码:

 

   List<Person> people  = new  List<Person>() ;
            
  
people.Add(  new  Person { FirstName  "Scott" , LastName  "Guthrie" , Age  32  } ) ;
  
people.Add(  new  Person { FirstName  "Bill" , LastName  "Gates" , Age  50  } ) ;
  
people.Add(  new  Person { FirstName  "Susanne" , LastName  "Guthrie" , Age  32  } ) ;
 

 

对这个例子,跟我使用C# 2.0编译器要输入的代码相比,单独使用新的对象初始化器特性就能省去12行额外的代码。

但Orcas版中的C#和VB编译器允许我们更进一步,现在同时支持“集合初始化器(collection initializers)”,这允许我们避免要写多个Add语句,省下更多的键盘操作:

 

    List<Person> people  = new  List<Person> {
      
new  Person { FirstName  "Scott" , LastName  "Guthrie" , Age  32  },
      
new  Person { FirstName  "Bill" , LastName  "Gates" , Age  50  },
      
new  Person { FirstName  "Susanne" , LastName  "Guthrie" , Age  32  }
   }
;

 

当编译器遇上上面这样的句法时,它会自动为我们生成象前面的例子一样的集合插入编码。

结语

作为开发人员,我们现在拥有了简明得多的方式来定义对象,对它们初始化,将它们加入集合内。在运行时,其语意,跟今天的较长的版本的语意,是完全一样的(所以你不必担心行为会改变)。但现在你不需输入那么多字符了,你的代码将既干净又简明。  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值