• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
口口念念
博客园    首页    新随笔    联系   管理    订阅  订阅
读书笔记之C#3.5 语言功能

一、具有隐式类型的局部变量var

C#提供了var关键字,只能声明局部变量,而且必须对变量赋非null的初始值,由编译器根据初始值推测具体的数据类型。

C#是强类型语言,即使使用了var关键字,同样没有质的变化,只是当编译器遇到var是,将根据初始值推测出相应的数据类型,如果在作用域里给同一变量赋予不同数据类型的新值则会产生编译错误,如下所示:

var x=3;

x=8.3;  //给同一变量赋予不同数据类型的新值则会产生编译错误

声明       var i = 5;

            var string="Hello World";

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

需要注意的问题:

  • 在声明时必须同时赋值
  •  不允许出现空类型
  • 初始化语句必须是一个表达式,且不能包含自身

使用范围:var的声明仅限于局部变量,也可以包含在foreach、for、using语句中

实例:

View Code
 1 class Program
2 {
3 static void Main(string[] args)
4 {
5 var s1 = "My Name is xiaoxiao";//相当于string s1="My Name is xiaoxiao";
6 var s2 = 20;
7 var s3 = 1.0;
8 var s4 = new string[] { "xiaoxiao", "xiaofang", "xiaoming" };
9 Console.WriteLine(s1);
10 Console.WriteLine(s2);
11 Console.WriteLine(s3);
12 foreach (var ss in s4)//Var声明仅限于局部变量,也可包含在foreach、for、using语句中
13 {
14 Console.WriteLine(ss);
15 }
16 Console.ReadLine();
17 }
18 }

运行结果如下:

 

二、扩展方法

扩展方法是一种特殊的静态方法,定义在一个静态类中,可以在其他类的对象上像调用实例方法那样进行调用。

其定义方法与一般静态方法的区别:扩展方法要在第一个参数的前面加上关键词this作为修饰符,同时第一个参数的类型也决定了扩展方法可以扩展的类型。

声明方式:

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

 

 

View Code
 1     class MyExt
2 {
3 int Age = 20;
4 public int myAge
5 {
6 set { Age = value; }
7 get { return Age; }
8 }
9 public void Write()
10 {
11 Console.WriteLine("大家好! 我是小钱 我的年龄是{0}",Age);
12 }
13 }
14 //定义扩展的类
15 static class myClass
16 {
17 public static void ExMyExt(this MyExt n)
18 {
19 Console.WriteLine("扩展MyExt类型");
20 n.myAge = 22;
21 n.Write();
22 }
23 }
24
25 class Program
26 {
27 static void Main(string[] args)
28 {
29 MyExt mx = new MyExt();
30 Console.WriteLine("这是静态方法!");
31 mx.Write();
32 Console.WriteLine();
33 Console.WriteLine("这是一个扩展方法");
34 mx.ExMyExt();
35 Console.ReadKey();
36 }
37 }

运行结果如下:

 



三、对象与集合初始化器

对象化初始化器可以在创建对象时向对象的任何可访问的字段或属性分配值。

(允许internal的成员赋值)

集合初始化器可以把几个对象一起添加到一个集合,编译器会自动进行集合插入操作。

功能:简化代码

 

四、匿名类型

通过对var的认识,我猜想var的出现其实完全是为了配合匿名类型而出现的。

在C#3.5中,通过使用“匿名类型”,只要在需要一个这样的对象时使用没有类型的new表达式,并用前面提前的对象初始化进行初始化即可。

使用关键字var指定匿名类型,例如:

C#3.5编译器固有的特性,在同一个程序集中,编译器将为属性出现顺序和类型完全相同的匿名类型对象生成唯一的一个类型。匿名类型的对象不能跨程序集访问。

五、Lambda表达式

可用在任何匿名或强类型委托的地方,C#编译器会使用合适的委托类型将Lambda表达式转化为标准的匿名方法。

C#3.5允许使用表达式树将Lambda表达式表示为一个内存对象。

Lambda表达式:内存=>标记

 

View Code
 1     class Program
2 {
3 static int[] i = new int[] { 1, 2, 3, 4 };
4 static void Main(string[] args)
5 {
6 Array.FindAll<int>(i, p =>
7 {
8 Console.WriteLine(p);
9 return p % 2 == 0;
10 });
11 Console.ReadKey();
12 }
13 }

运行结果如下:

 


 

六、自动属性

简化属性的声明,可以避免原来声明私有成员变量以及编写get/set逻辑的麻烦

 

自动属性
 1     class Program
2 {
3 static int[] i = new int[] { 1, 2, 3, 4 };
4 static void Main(string[] args)
5 {
6 Array.FindAll<int>(i, p =>
7 {
8 Console.WriteLine(p);
9 return p % 2 == 0;
10 });
11 Console.ReadKey();
12 }
13 }



 

posted on 2012-02-23 21:45  口口念念  阅读(189)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3