你的位置:首页 > ASP.net教程

[ASP.net教程]C#语法糖之第一篇:自动属性隐式类型


今天给大家分享一下C#语法糖的简单的两个知识点吧。

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

我们C#4.0以前的传统方式的属性是用来封装字段的,这里我简单的对比一下这两种方式的不同及关联关系吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class AutoProperty
 
    {
 
        //传统方式定义属性必须先定义字段来封装
 
        private string name;
 
        public string Name
 
        {
 
            get return name; }
 
            set { value = name; }
 
        }
 
        //自动属性
 
        public string LoginName { getset; }
 
    }




  从代码的字数上看传统方式的写法比较繁琐,自动属性一行代码即可实现,然后到底这两个功能上有什么区别呢,这里我用反编译工具来看了一下(反编译工具用的是.Net Reflector 8.3),具体效果如下:

虽然我们在写代码是没有写字段,但是编译器帮我们自动生成字段,然后在每个属性的get和set访问器在看一下会发现

1
2
3
4
5
6
7
8
9
10
//传统方式
public void set_Name(string value)
{
    value = this.name;
}
 
public string get_Name()
{
    return this.name;
}




  

1
2
3
4
5
6
7
8
9
10
11
12
//自动属性
[CompilerGenerated]
public void set_LoginName(string value)
{
    this.<LoginName>k__BackingField = value;
}
 
[CompilerGenerated]
public string get_LoginName()
{
    return this.<LoginName>k__BackingField;
}




  使用自动属性注意的地方:从上面代码上可以看出来访问器格式基本差不多,就是自动属性访问器上标记为编译器生成,然后字段也是编译器生成的字段。所以传统方式和自动属性对于编译去来说效果是一样的,只不过这些繁琐的操作编译器帮我们生成了,以减少程序员写的代码和让代码的逻辑很清晰,很简短。

1、            对于自动实现的属性,需要 get 和 set 访问器。 要使该类不可变,请将 set 访问器声明为 private。 set accessor, you cannot use an object initializer to initialize the property." id="mt5">但是,声明私有 set 访问器时,不能使用对象初始值来初始化属性。 必须使用构造函数或工厂方法。

1
2
3
4
5
6
7
8
public string CustomerId { getprivate set; }
public AutoProperty(string _CustomerId)
 
        {
 
            this.CustomerId = _CustomerId;
 
        }




隐式类型:可 以赋予局部变量推断“类型”var 而不是显式类型。 var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。 推断类型可以是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型,这是微软MSDN给出的定义,其实隐式类型简单的理解就是程序员在声明变量可以不用指定类型,由编译器根据值来指定类型。2、            如果需要在属性中有复杂的业务逻辑的话还得用传统的属性来实现,不管什么东西都有它的利与弊,只要我们适当的利用即可。

理论就说怎么多,下面咱们直接帖代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void Test()
 
        {
 
             //传统方式定义变量
 
            string CustomerId = "客户";
 
            var NewCustomerId = "隐式类型";
 
            var Age = 20;
 
            var Array = new string[] {"111","222"};
 
            object objectstring = "object";
 
            Console.WriteLine("传统类型:"+CustomerId+" "+"隐式类型"+NewCustomerId);
 
}




瑞士旅游去哪好瑞士旅游团报价优惠瑞士蜜月旅游行程参考瑞士特价旅游多少钱到瑞士游费用报价大全北海特色餐饮介绍 回族--一个神秘而美丽的民族 巴黎购物好时节 详尽攻略别错过 北海特产一览 潍坊动物园门票价格?潍坊金宝乐园动物园怎么收费? 潍坊动物园门票多少钱?潍坊有动物园吗? 潍坊市动物园在哪里?潍坊看动物去哪里? 新兴金水台漂流网上订票?金水台漂流预订优惠吗? 2015端午节去海南三亚买什么好? 桂林五排河漂流在哪?怎么去? 2015年端午去丽江玩怎么样?去丽江玩什么 桂林银水侗寨要门票吗?门票是多少? 上海旅游必须注意的事项有哪些? 云南双廊在哪? 2015年的春运时间是什么时候?多少号开始? 上海最有特色的街边小吃有哪些? C5SMB-AJS-CQ0T0AA2 Datasheet C5SMB-AJS-CQ0T0AA2 Datasheet C5SMB-BJS-CN0R0451 Datasheet C5SMB-BJS-CN0R0451 Datasheet C5SMB-BJS-CN0R0452 Datasheet C5SMB-BJS-CN0R0452 Datasheet 拓展训练网 拓展训练网 拓展训练网 水上拓展训练 水上拓展训练 水上拓展训练 番禺野外拓展训练 番禺野外拓展训练 番禺野外拓展训练