1、自动属性
之前的实现方式:
private int id; public int Id { set {id = value;} get {return id;} }
现在可通过自动属性实现: public int Id{ get; set; }
2、推断类型(var):推断类型,又名隐式类型,使用var关键字,可以是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型。
从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。隐式类型的本地变量是强类型变量,但由编译器确定类型。
下面的两个 i 声明在功能上是等效的:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
使用 var 声明局部变量的各种方式:
// i is compiled as an int var i = 5; // s is compiled as a string var s = "Hello"; // a is compiled as int[] var a = new[] { 0, 1, 2 }; // expr is compiled as IEnumerable<Customer> // or perhaps IQueryable<Customer> var expr = from c in customers where c.City == "London" select c; // anon is compiled as an anonymous type var anon = new { Name = "Terry", Age = 34 }; // list is compiled as List<int> var list = new List<int>();
小结:
[1]变量必须在声明的同时被初始化,编译器要根据初始化值推断类型;初始化表达式不能是null;例如不能用var a; 或 var a = null;声明。
[2]该类型在第一次声明时已具有类型。例如:var a=1; a=""; //报错,因为前面var a=1;已经推断出a为整形了,所以不能把字符串赋值给整形
[3]var 变量不能作为全局变量使用,被声明的变量是一个局部变量,而不是静态或实例字段;
[4]初始化不是一个匿名函数;
[5]语句中只能声明一次变量,声明后不能更改类型;
[6]赋值的数据类型必须是可以在编译时确定的类型;
3、参数默认值
实例如下:
void DefaultPara(int age=10,string name="Jack") { Console.WriteLine(age+":"+name); } 测试: defaultPara(); //输出10:Jack defaultPara(15); //输出15:Jack defaultPara(20,"Mary"); //输出20:Mary
注意:只给name参数时,应用参数名;例如DefaultPara(name:"John"); //输出10:John;
4、对象、集合初始化器
public class User {
public int name{ get; set; }
public int age{ get; set; }
}
[1]对象初始化器:User user = new User(){name:"Jack",age:18};
[2]集合初始化器:List<User> list = new List<User>(){new user(){name:"Jack",age:18}, new user(){name:"Mary",age:21}}
[3]数组初始化器:string[] str = {"123", "456", "789"}
5、匿名类:属性名字或顺序不同生成不同的泛型类
[1]编译后会生成一个 泛型类:var user= new { name = "James", age = 18 };
[2]如果另一个 匿名类对象 的属性 类型和顺序 一样,那么会共用同一个匿名类!
var user1= new { name = "James2", age = 19 }; Console.WriteLine(user.GetType() == user1.GetType());//true
[3]如果另一个匿名类对象 的属性名称和顺序一样,但类型不一样,那么还是使用相同的匿名类,只不过,泛型参数改变而已
var user2= new { name = 123, age = "James3" }; Console.WriteLine(user1.GetType()==user2.GetType());//true
[4]如果属性名相同,类型相同,但是顺序不同,那么也会重新创建一个匿名类!
var user3 = new { age = 19, name = "James4" }; Console.WriteLine(user3.GetType() == user4.GetType());//false