字母拼凑者之家

每天向前一小步
随笔 - 4, 文章 - 0, 评论 - 2, 引用 - 0
数据加载中……

2008年7月23日

LINQ学习笔记之三 —— 其他新特性

 

LINQ学习笔记之三

——其他新特性

 

    LINQ中,用到了很多.NET Framework 3.5中的新特性,有了这些特性,才使LINQ的到很好的实现,这些新特性包括匿名类型、隐式类型化局部变量、对象初始化器、自动属性和集合初始化器。下面就来详细介绍一下这些特性。

1.         匿名类型

匿名类型,顾名思义就是没有名称或者不用定义名称的类型。编译器会自动生成类型的名称和类型中的属性。例如:

using System;

 

// 匿名类型演示

namespace MyConsoleApplication

{

    class Program

    {

        static void Main(string[] args)

        {

            var myClass = new { Name = "MyClass", Age = 20 };

            Console.WriteLine(string.Format("Name:{0} | Age:{1}",

                myClass.Name, myClass.Age.ToString()));

            Console.Read();

        }

    }

}

 

结果显示:

Name:MyClass | Age:20

       反编译后的IL代码如下:

        

       可以看到,系统自动生成的类和其中的字段、属性。需要注意的是,匿名类型中的属性是只读属性,只能在匿名类型定义时定义并赋值。 

2.         隐式类型化局部变量

这个隐式类型化局部变量,就是之前多次出现的使用var关键字定义的变量。看到var的第一个反应就是javascript里面的var关键字。但C#毕竟是强类型语言,var关键字的作用,只是在声明变量时不用写明变量的类型,但是在编译器编译时,还是会自动推断变量的类型,所以变量在定义后,还是无法更改类型的。

P.S. .NET Framework 3.5编译器的类型推断功能已经不是一般的强大了,像隐式类型化局部变量、Lambda表达式,都用到了类型推断。

需要注意的是,隐式类型化局部变量必须在声明时赋值,并且不能赋值为null

3.       对象初始化器和自动属性

这两个特性在之前都已经使用过。对象初始化器就是允许在实例化对象时,直接对对象中的可写属性进行赋值。自动属性可以不定义字段,只定义属性的读写特性和访问级别,由编译器在编译时自动生成字段。如下:

using System;

 

// 对象初始化器和自动属性的演示

namespace MyConsoleApplication

{

    class Program

    {

        static void Main(string[] args)

        {

            // 对象初始化器

            MyClass myClass = new MyClass { Address = "BeiJing", Age = 20, Name = "MyClass" };

        }

    }

 

    class MyClass

    {

        // 自动属性,定义了set的可访问性

        public string Name { get; internal set; }

 

        public int Age { set; get; }

 

        public string Address { set; private get; }

    }

}

自动属性的缺点有:无法自定义属性中的操作;在程序中不能访问字段(因为根本就没有定义字段,字段是由编译器生成的)。自动属性只起到一个数据访问接口的作用,并且自动属性必须定义getset访问器。

4.       集合初始化器

集合初始化器的作用就是在集合对象实例化时,自动将所需元素添加至集合中。例如:

using System;

using System.Collections.Generic;

 

// 集合初始化器的演示

namespace MyConsoleApplication

{

    class Program

    {

        static void Main(string[] args)

        {

            // 集合初始化器

            IList<MyClass> myList = new List<MyClass>{

             new MyClass { Address = "BeiJing", Age = 20, Name = "MyClass" },

             new MyClass { Address = "ShangHai", Age = 25, Name = "MyClass2" },

             new MyClass { Address = "TianJin", Age = 19, Name = "MyClass3" }

            };

            Console.WriteLine(myList.Count.ToString());

            Console.Read();

        }

    }

 

    class MyClass

    {

        // 自动属性,定义了set的可访问性

        public string Name { get; internal set; }

 

        public int Age { set; get; }

 

        public string Address { set; private get; }

    }

}

 

结果显示:

3

——————— 必定出现的分割线 ————————

再说扩展方法:

扩展方法可以起到削减类的职责的作用,类中只定义必要的数据结构(字段和属性)、构造器(终结器)、转换器,然后利用扩展方法,为类添加适当的职责。这样可以减少子类的创建。

个人觉得这种方法不利于进行面向接口的编程,扩展方法之所以叫扩展方法,说明她的主要功能还是在于“扩展”而不是“定义”或“规定”。但是在一些接口或者基类上定义的扩展方法,还是可以起到很重要的作用的。

posted @ 2008-07-23 22:30 LeonSun 阅读(13) | 评论 (0)编辑

2008年7月17日

LINQ学习笔记之二 —— Lambda表达式和Lambda表达式树

     摘要: LINQ学习笔记之二——Lambda表达式和Lambda表达式树 Lambda表达式(Lambda Expressions)是LINQ实现的另一特性。Lambda表达式的作用就是使用使用函数式语法,将方法实现关联到委托实例。在使用查询表达式(Query Expressions)时,查询表达式也将被语法映射为扩展方法(Extension Methods)和Lambda表达式配合使用的形式。 先来说说...  阅读全文

posted @ 2008-07-17 21:15 LeonSun 阅读(73) | 评论 (0)编辑

2008年7月15日

LINQ学习笔记之一 —— 扩展方法

     摘要: LINQ学习笔记之一——扩展方法 LINQ(读作Link)语言集成查询(Language Integrated Query)是.NET Framework 3.5中一项重要的新特性,它的作用是为了在高级语言中,以类型安全的通用方式完成数据的基本操作,如查询、排序、汇总等。 LINQ的实现基础是扩展方法(Extension Methods)、查询表达式(Query Expressions)、Lamb...  阅读全文

posted @ 2008-07-15 22:42 LeonSun 阅读(78) | 评论 (0)编辑

2008年5月11日

一个笑话引发的思考

    做为博客园的开篇,写个个人感悟,让自己时时刻刻记住这些该记住...
    起因:一个并不是很搞笑的笑话。说有两个旅行家,在一次旅行中迷了路。不久,他们的干粮全都吃完了,其中的一个旅行家就对另一个说,你去周围找找,看看有没有什么能吃的东西。不久,那个旅行家回来说:“我带回了一个好消息和一个坏消息。”“先说坏消息吧。”“我们以后只能靠吃牛粪生活了。”“(呕吐但贼心不死状...)那好消息呢?”“牛粪有的是.....”

———————————— 有点儿反胃的分割线 ————————————

    结果:这个故事告诉我们三个道理
    1、做事情不要只看到表面,表面现象往往并不是最真实的。能通过牛粪看到牛,这样才算是了解一件事。遇事多思考,并且从不同方向去思考,才能透过现象看本质。
    2、在没有看到事物的本质之前,不要妄下结论。
    3、对一个笑话的内容过分较真,将使故事失去原有的趣味性。与人相处、处理事情也是同样的道理。

posted @ 2008-05-11 11:15 LeonSun 阅读(210) | 评论 (2)编辑