c#3.5语言功能

c#3.5语言特性有:

1.隐含本地变量类型,本地变量的类型可以从初始化该变量的表达式推断得知。

2.对象初始化器,使得构造和初始化对象更加方便。

3.Lambda表达式,为代理类型和表达式数提供了改进的类型推断和转换。

4.扩展方法,可以实现有类型添加新的方法。使用扩展方法,类型没有被扩展,但是看上去好像是被扩展了。

5.匿名类型,可以从对象初始化器自动创建。

 隐藏类型化的局部变量

val i=5;

var string="Hello Word"; 

var Array=new int[]{1,2,3}; 

1.声明时需要注意的问题:

(1).在声明是必须同时赋值,因为声明依赖与赋值右边的表达式。在使用var声明一个局部变量后,他仍然具有强类型

(2).初始化语句必须是一个表达式,初始化表达式不能包含自身,但可以包含对象或集合初始化器的一个new表达式。

2.使用范围

var的声明仅限于局部变量,也可以包含在foreach,for,using语句中。

在foreach语句中:

foreach(var item in list){...}

在for语句中:

for(var i=1;i<5,x++){...}

在using语句中

using(var file=new StreamReader("c:\\myfile.txt")){...}

static void Main(string[] args)
{
var s1 = "My Name is xiaoxiao";//相当于 string s1="My Name is xiaoxiao";
var s2 = 20;//相当于 int s2=20;
var s3 = 1.0;//相当于 double s3=1.0;
var s4 = new string[] { "xiaoxiao", "xiaoxiao", "xiaoxiao" };//相当于 string s4=new string[]{"xiao","xiao","xiao"};
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine(s3);
foreach (var ss in s4)
{
Console.WriteLine(ss);
}
Console.ReadKey();
}

扩展方法

扩展方法是一种特殊的静态方法,定义在一个静态类中,但可以在其他类的对象上像调用实例方法那样进行调用。所以就可以在不修改一个类型的前提下对一个类型进行功能上的扩充。扩展方法的引人并非只为了简单地扩展现有的类,扩展方法的使用有一定的限制。扩展方法更大的意义在于,她为以后将要介绍的查询表达式,查询表达式模式和标准运算符的实现奠定了基础。

扩展放大和一般的静态方法的定义方法类似,唯一的区别是在第一个参数的前面要加上关键子this作为修饰符,同时第一个参数的类型也决定了扩展方法可以扩展的类型。扩展方法的声明方法:

public static 返回类型 扩展方法名(this 要扩展的类型 sourceObj[,扩展方法参数列表])

c#3.5语言特性有:

1.隐含本地变量类型,本地变量的类型可以从初始化该变量的表达式推断得知。

2.对象初始化器,使得构造和初始化对象更加方便。

3.Lambda表达式,为代理类型和表达式数提供了改进的类型推断和转换。

4.扩展方法,可以实现有类型添加新的方法。使用扩展方法,类型没有被扩展,但是看上去好像是被扩展了。

5.匿名类型,可以从对象初始化器自动创建。

 隐藏类型化的局部变量

val i=5;

var string="Hello Word"; 

var Array=new int[]{1,2,3}; 

1.声明时需要注意的问题:

(1).在声明是必须同时赋值,因为声明依赖与赋值右边的表达式。在使用var声明一个局部变量后,他仍然具有强类型

(2).初始化语句必须是一个表达式,初始化表达式不能包含自身,但可以包含对象或集合初始化器的一个new表达式。

2.使用范围

var的声明仅限于局部变量,也可以包含在foreach,for,using语句中。

在foreach语句中:

foreach(var item in list){...}

在for语句中:

for(var i=1;i<5,x++){...}

在using语句中

using(var file=new StreamReader("c:\\myfile.txt")){...}

static void Main(string[] args)
        {
            var s1 = "My Name is xiaoxiao";//相当于 string s1="My Name is xiaoxiao";
            var s2 = 20;//相当于 int s2=20;
            var s3 = 1.0;//相当于 double s3=1.0;
            var s4 = new string[] { "xiaoxiao", "xiaoxiao", "xiaoxiao" };//相当于 string s4=new string[]{"xiao","xiao","xiao"};
            Console.WriteLine(s1);
            Console.WriteLine(s2);
            Console.WriteLine(s3);
            foreach (var ss in s4)
            {
                Console.WriteLine(ss);
            }
            Console.ReadKey();
        }

扩展方法

扩展方法是一种特殊的静态方法,定义在一个静态类中,但可以在其他类的对象上像调用实例方法那样进行调用。所以就可以在不修改一个类型的前提下对一个类型进行功能上的扩充。扩展方法的引人并非只为了简单地扩展现有的类,扩展方法的使用有一定的限制。扩展方法更大的意义在于,她为以后将要介绍的查询表达式,查询表达式模式和标准运算符的实现奠定了基础。

扩展放大和一般的静态方法的定义方法类似,唯一的区别是在第一个参数的前面要加上关键子this作为修饰符,同时第一个参数的类型也决定了扩展方法可以扩展的类型。扩展方法的声明方法:

public static 返回类型 扩展方法名(this 要扩展的类型 sourceObj[,扩展方法参数列表])

  class MyExt
    {
        int age = 20;
        public int myAge
        {
            get { return age; }
            set { age = value; }
        }
        public void Write()
        {
            Console.WriteLine("hi,I'm Ann,and my age is {0}", myAge);
        }
    }

    static class myClass
    {
        public static void ExMyExt(this MyExt n)
        {
            Console.WriteLine("扩展MyExt类型");
            n.myAge = 22;
            n.Write();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyExt mx = new MyExt();
            Console.WriteLine("这是静态的方法!");
            mx.Write();
            Console.WriteLine("这是一个扩展方法");
            mx.ExMyExt();
            Console.ReadKey();
        }
    }

 对象与集合初始化器

1.对象初始化器

   使用对象初始值设定项可以在创建对象时向对象的任何访问的字段或属性分配值,而无需显示调用构造函数。

 class Book
    {
        public string BookNmae { get; set; }
        public int Price { get; set; }
        public string content { get; set; }
        internal int Num;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book { BookNmae="c#",Price=56,content="好看",Num=50};
            Console.WriteLine(book.Num);
            Console.WriteLine(book.BookNmae);
            Console.ReadKey();
        }
    }
//最后显示的结果是 :c#   50

 

2.集合初始化器

  集合初始化器是由一系列集合对象组成,用逗号间隔,用{}封闭。集合初始化器可以把几个对象一起添加到一个集合,编译器会自动进行集合插入操作。集合初始化器中可以构造集合的一项为空值,例如:

  List<Book> book=new List<Book>

  {

       new Book{BookName="c#",Price=56,content="好看"};

    new Book{BookName="ASP.NET",Price=41,content="呵呵"};

     new Book{BookName="jave",Price=54,content="不错"};

            null;

  }

使用集合初始化器可以避免书写多个Add语句。

匿名类型

匿名类型只要在需要一个这样的对象时使用没有类型名字的new表达式,并用对象初始化器进行初始化即可。使用关键字var指定匿名类型:

var s1=new {name="asp.net",Price=59};

var  s2=new {name="jave",Price=56};

Console.WriteLine(s1.GetType());

Console.WriteLine(s2.GetType());

前面两行声明并初始化两个具有匿名类型的对象,他们有公共可读可写属性.我们可以看出匿名类型的属性可以省略。

Lambda表达式

c#3.5允许使用表达式树将Lambda表达式表示为一个内存对象,Lambda表达式是一种更简洁的创建匿名方法并最终简化.NET委托类型使用的方式。Lambda表达式可用在任何匿名或强类型委托的地方,c#编译器会使用合适的委托类型将Lambda表达式转化为标准的匿名方法。一个Lambda表达式的构成是首先定义一个参数列表,后跟=>标记,再跟一个语句集(或是单独的一条语句),这些语句会处理先前的参数。在一个较高的抽象级别上可以理解:

p=>p.BookNmae=="c#2008"

 

 

 

 

自动属性

当属性访问器中访问器中不需要其他逻辑时,自动实现的属性可使属性声明吧变得更加简洁。自动属性可以避免原来声明私有成员变量以及编写get/set逻辑的麻烦。

public class Student

{

  private string _id;

  private  string _name;

  private int _age;

  private  string _sex;

  public  string Name  

        {

           get {return _Name;} 

           set { _Name   =value;}

         }

          public intg Set

    {

      get {return _sex;};

      set {_sex=value;};

    }

    pulic int Age

    {

        get {return _age;};

        set {_age=value;};

    }

  在c#e3.5中,可以不定义私有变量,直接使用空的get/set属性,并且会自动在类中生成一个私有变量。

 

 

 


 

posted @ 2012-02-23 15:00  ·1234567890  阅读(239)  评论(0)    收藏  举报