C# 3.0 新特性

 隐式类型变量:

         对于一些无法确定的类型使用隐式类型变量是非常有用的。如LINQ里:

  1. static void Main(string[] args)
  2.  {
  3.     int[] numbers = {1,2,3,4,5,6,7,8,9};
  4.        //使用LINQ查询语法查询数组中的偶数
  5.     var querySet = from i in numbers where i%2 == 0 select i;
  6.     Console.WriteLine("查询结果为:");
  7.        //遍历查询结果,并在屏幕上输出
  8.     foreach(var i in querySet)
  9.     {
  10.         Console.Write("{0},",i);
  11.     }
  12.  }

            在声明隐式类型变量时必须指定一个初始值,以便编译器进行类型推断,一个var不能同时声明多个隐式变量。

    • var strVar = "这是隐式类型变量";  //编译器根据指定的值推断出变量类型为String类型
    • var intVar = 0;  //编译器根据指定的值推断出变量类型为int类型
    • var a = 1,b = 2; //产生编译时错误

           隐式类型变量只限于局部变量,如果将隐式类型变量声时于类变量、参数或返回值将产生错误。

 

 

自动属性:

        自动属性特性简化了编写属性代码的复杂性,由编译器来代替人的这种重复性工作。

  1. public class book
  2. {
  3.     //一个简单的属性示例
  4.     private string _bookname = string.Empty;
  5.     public string BookName
  6.     {
  7.           getreturn _bookName; }
  8.           set{ _bookName = value;} 
  9.      }
  10. }
  11. public class book 
  12. {
  13.     //使用自动属性
  14.     public string BookName{ get;set;}
  15. }

以上两个类实现的属性功能是一样的。

 

对象初始化器:

    使用对象初始化器可以在创建对象时直接向对象赋值,无需显式地调用对象的构造函数。

  1. //一个简单的书籍类
  2. public class Book
  3. {
  4.     //书名属性
  5.     public string BookName{get;set;}
  6.     //书ISBN属性
  7.     public string ISBN{get;set;}
  8.     //书的价钱属性
  9.     public double price{get;set;}
  10. }
  11. //不使用对象初始化器来初始化对象
  12. class Program
  13. {
  14.     strtic void Main(string[] args)
  15.     {
  16.         Book book = new Book();
  17.         book.BookName = "程序设计";
  18.         book.ISBN = "0000000000";
  19.         book.Price = 99.9;
  20.     }
  21. }
  22. //使用对象初始化器初始化对象的代码如下:
  23. Book book = new Book()
  24. {
  25.     BookName = "程序设计",
  26.     ISBN = "0000000000",
  27.     Price = 99.9
  28. };

使用对象初始化器时类的构造函数可以正常使用。

 

如果集合的成员本身需要初始化,可以使用内部类型的初始化语法来对其初始化,假如有一个泛型Book类,可以使用如下代码来初始化集合:

  1. List<Book> books = new List<Book>
  2. {
  3.     new Book("编程书籍")
  4.     {
  5.         bookName = "程序设计",
  6.         ISBN = "0000000000",
  7.         Price = 99.9
  8.     },
  9.     new Book("小说")
  10.     {
  11.         bookName = "金瓶梅",
  12.         ISBN = "111111111",
  13.         Price = 99.9
  14.     },
  15.     new Book("编程书籍")
  16.     {
  17.         bookName = "c#程序设计",
  18.         ISBN = "2222222222",
  19.         Price = 99.9
  20.     }
  21.   
  22. };

 

扩展方法:

    如果想给任何已编译好的类添加新的工能,扩展方法解决了必须更改源代码或者从该类中派生的问题。开发人员可以在一个单独的类中对已存在的类进行扩展,为其添加附加的方法。

定义扩展方法:

    扩展方法必须在一个静态类中,扩展方法自身必须是一个静态方法。

    扩展方法中首个参数必须是this,最后紧跟扩展的类的名称。

    扩展方法可以正确的对象实例调用,也可以使用静态类名进行静态的调用。

    以下示例演示如何给Object对像类型添加SayHello方法:

  1. //定义一个静态类
  2. public static class ExtensionMethods
  3. {
  4.     //定义一个静态方法,该方法扩展Object对象
  5.     public static void SayHello(this Object obj)
  6.     {
  7.          Console.WriteLine("Hello I'm ExtensionMethods!");
  8.      }
  9. }
  10. //承继于这个类的子类都包含这个方法

扩展方法使用范围:

    扩展方法不能与要扩展的类有相同名称

    不能在扩展方法中直接访问扩展方法扩展的类的成员变量。要访问时应该如:扩展类.变量

    如果扩展方法与被扩展类有不同的命名空间,需要在调用扩展方法时引用定义扩展方法的命名空间。

 

 

匿名类型:

不具有名称的类型,开发人员只需要临时地使用一个类型表达一些信息,这个类只需要保存一些只读的信息,如状态信息等,并不需要关联任何方法、事件等,这时候开发人员可以不用显式地去定义一个类,可以考虑使用匿名类型。

 

  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         //初始化一个Book类的实例
  6.         Book book = new Book()
  7.         book.BookName = "C# 啥啥啥!";
  8.         book.ISBN = "000000000";
  9.         book.Price = 9.9;
  10.         //显示内容
  11.         Console.WriteLine("书名是:{0},ISBN是:{1},价格是:{2}",book.BookName,book.ISBN,book.Price);
  12.     }
  13. }
  14. public class Book
  15. {
  16.     public string BookName{get;set;}
  17.     public string ISBN{get;set;}
  18.     public double Price{get;set}
  19. }
  20. //如果以后不重用Book类的话使用匿名类型形式代码会大大减少。
  21. //匿名类型:
  22. static void Main(string[] args)
  23. {
  24.     var book = new {BookName = "C# 啥啥啥!",ISBN = "0000000000",Price = 99.9};
  25.     Console.WriteLine("书名是:{0},ISBN是:{1},价格是:{2}",book.BookName,book.ISBN,book.Price);
  26. }
  27. //注意: 匿名类型必须使用var进行隐式声明,匿名类型中只能包含公共的属性,不能包含方法或者是事件

 

局部类与局部方法:

局部类使开发人员将一个类的实现定义到多个代码文件中,只需要使用关键字Partial在多个文件中使用相同的类名即可,编译时编译器将生成一个完整的类.局部方法同样使用Partial关键字定义.

    局部方法仅使用于局部类中.

    局部方法的返回值必须是void.

    局部方法可以是静态的或者是实例化的.

    局部方法可以有参数,可以包含参数修饰符如this,ref或者Params,但不包括out修饰符.

    局部方法隐式访问级别为private ,因此不能为虚方法.

  1. //book.cs 
  2. namespace PartialMethod
  3. {
  4.     public partial class Book
  5.     {
  6.         public bool BuyBook(string BookName)
  7.         {
  8.             bool instock = false;
  9.             //调用局部方法来判断所要购买的书是否有库存  
  10.             BookInStock(BookName,ref instock);
  11.             return instock;
  12.          }
  13.          //这是一个局部方法,在这里并没有提供任何方法的实现  
  14.          partial void BookInStock(string BookName,ref bool instock);
  15.     }
  16.     
  17. }
  18. //BookInStock.cs 
  19. namespace Partialmethod
  20. {
  21.     public partial class Book
  22.     {
  23.          //局部类中的局部方法,根据书名判断存货 
  24.          partial void BookInStock(string BookName,ref bool instock)
  25.          {
  26.                if(BookName == "C# 啥啥啥书")
  27.                { 
  28.                      instock = true;
  29.                }
  30.                else
  31.                {
  32.                      instock = false;
  33.                }
  34.          }
  35.     }
  36. }

 

Lambda 表达式

  “Lambda 表达式”是一个匿名函数.Lambda表达式格式为:

    (参数列表) => 表达式或者语名块

  1. //可以有一个或多个参数,也可以无参数.参数类型可隐式或显式声明.
  2. (x,y) => x * y;                              //多个参数,隐式类型 => 表达式
  3. x => x * 10;                                   //单参数, 隐式类型 =>表达式
  4. x => { return x * 10;};                 //单参数, 隐式类型 => 语句块
  5. (int x) => x * 10;                          //单参数,显式类型 => 表达式
  6. (int x) => {return x * 10;};          //单参数,显式类型 => 语句块
  7. () => Console.WriteLine();          //无参数

C#的Lambda表达不具备即时调用的能力,必须用一个已知委托类型的变量接受它后,才能通过委托变量调用。

  1. //silverlight 中的timer调用中使用Lambda的例子
  2. System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
  3.  dt.Interval = new TimeSpan(0,0,0,1);
  4.   dt.Tick += (Object sender, EventArgs e) => { this.label1.Text = DateTime.Now.ToString(); };
  5.   dt.Start();

Lambda表达式与委托变量:必须有相同的参数个数,参数类型相同。返回类型相同。

  1.     delegate string del(string str,string str1);
  2.     protected void Button1_Click(object sender, EventArgs e)
  3.     {
  4.         del dd = (string a, string b) => { return a + b; };
  5.         this.Label1.Text=dd(this.TextBox1.Text,this.TextBox2.Text);
  6.     }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值