|
|
Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,C# 3.0新语言特性在.NET2.0基础上进行了改进,这些改进的功能可以大大简化我们编写程序。在此为了自己学习记录下来,并与大家分享
.NET 3.5的新特性包括:
自动属性(Auto-Implemented Properties)
隐含类型局部变量(Local Variable Type Inference)
匿名类型(Anonymous Types)
对象与集合初始化器(Object and Collection Initializers)
扩展方法(Extension Methods)
Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)
LINQ,语言级集成查询(Language INtegrated Query)
自动属性(Auto-Implemented Properties)
自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑,在VS2008中可以像下面这样编写一个类,编译器会自动地生成私有变量和默认的get/set 操作。你也可以分别定义get和set的"protected"等访问级别。
在.Net2.0框架下,我们可以这样写一个User类:
public class User
{
private int _id;
private string _name;
private int _age;
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
}现在,可以这样简化:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
我们可以利用VS.NET提供的ildasm进行反编译,可以发现.NET帮我定义了私有变量,在此不再赘言。
隐含类型局部变量(Local Variable Type Inference)
C#3.0引进了var这个新关键字,在声明局部变量时可用于替代原先的类型名,即当一个变量声明标识为var类型并且该范围域中没有var名称类型存在,那么这个声明就称为隐含类型局部变量。如下(等同于//后面的显式声明):
var i = 5;//int
var j = 23.56;//double
var k = "C Sharp";//string
var x;//错误
var y = null;//错误
var z = { 1, 2, 3 };//错误
注意事项:
必须对var声明的变量赋值,因为C#中的var并不等同于VB于Javascript中的var,后者中 的var为一种变量类型,而在C#中var并不是一种类型,它只用来隐式的声明变量,而你定义的变量类型由编译器判断;
Var声明的变量不能赋null;
Var只能声明局部变量;
不允许,改变var变量的类型
Var x = 100;
X = "Hello world!"
由此可知,var的变量也是强类型的变量,具有安全性。
匿名类型(Anonymous Types)
匿名类型允许定义行内类型,无须显式定义类型。常和var配合使用来声明匿名类型。
var p1 = new { Id = 1, Name = "tony", Age = 21 };//属性也不需要申明
var p2 = new { Id = 2, Name = "dream", Age = 21 };
var p3 = new { Id =3 , age = 21, Name = "tony"}
p1 = p2;//p1,p2结构相同,可以互相赋值 ,p1与p3不是相同的对象,所以使用匿名类型时我们尽量将具有相同属性的变量,属性的顺序保持一致。
在这里编译器会认为p1,p2相当于:
public class SomeType
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}那么数组怎么定义呢?使用"new[]"关键字来声明数组,加上数组的初始值列表。像这样:
var intArray = new[] { 2, 3, 5, 6 };
var strArray = new[] { "Hello", "World" };
var anonymousTypeArray = new[]
{
new { Name = "tony", Age = 21 },
new { Name = "dream", Age = 22 }
};
var a = intArray[0];
var b = strArray[0];
var c = anonymousTypeArray[1].Name;
可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
匿名类型直接继承自System. Object。
匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。
对象初始化器 (Object Initializers) :
.NET2.0框架中的类型非常依赖于属性。当生成对象实例和使用新的类型时,在.Net2.0时候我们像这样写:
User user = new User();
user.Id = 1;
user.Name = "tony";
user.Age = 22;在VS2008中,编译器会自动地生成合适的属性setter代码,使得原来几行的属性赋值操作可以在一行完成。我们可以这样简化:像这样,对象初始化器由一系列成员对象组成,其对象必须初始化,用逗号间隔,使用{}封闭。
User user = new User { Id = 1, Name = "tony", Age = 21 };又例如,我把二个人加到一个基于泛型的类型为User的List集合中:
List<User> user = new List<User>{
new User{Id=1,Name="tony",Age=21},
new User{Id=2,Name="dream",Age=12},
};
如果有相同名字和类型的两个对象初始化器将会产生相同的实例,可以相互赋值。例如:
User user = new User { Id = 1, Name = "tony", Age = 21 };
User user2 = new User { Id = 2, Name = "tony", Age = 12 };
user = user2;
除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型。例如我们可以在上面定义的User类型同时拥有一个属于School类型的叫"School"的属性:
User user = new User
{
Id = 1,
Name = "tony",
Age = 21,
School = new School
{
City = "Beijing",
Name = "BTBU"
}
};
集合初始化器(Collection Initializers):
集合初始化器由一系列集合对象组成,用逗号间隔,使用{}封闭。
集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为int的List集合中
List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };对象与集合初始化器要点
|
|