[基础] asp.net 中的一些语法糖(新语法)
1. 自动属性
1 namespace 新语法 2 { 3 public class Student 4 { 5 /// <summary> 6 /// 1.1 定义一个属性,用于公开给外界访问。 7 /// </summary> 8 public int StudentNo { get; set; } 9 10 /// <summary> 11 /// 编译器语法糖:自动属性。 12 /// </summary> 13 public string StudentName { set; get; } 14 15 public override string ToString() 16 { 17 return "StudentNo=" + StudentNo + " StudentName=" + StudentName; 18 } 19 } 20 }
2. 隐式类型
1 // 隐式类型: var 2 // 1. 隐式类型必须有初始值,否则编译器不能推断出其类型。 3 // 2. 类型一旦确定,就不能在赋值其他类型。 4 // 3. 只能做方法的局部变量使用。 5 // 4. var 不能做形式参数。 6 // 5. var 不能复制匿名委托。 7 // 7. var 不能赋值为空。 8 var student = new Student(); 9 // 编译器 自动推断其类型。 10 int id = student.StudentNo; 11 //var varDelegate = delegate() { return 1; } 12 //var varNull = null; 13 Console.WriteLine(id);
3. 参数默认值和命名参数
1 public static void GetDefault() 2 { 3 DefaultValue(); 4 DefaultValue("张三"); 5 // 命名参数的写法 6 DefaultValue(age: 50); 7 } 8 9 /// <summary> 10 /// 参数默认值。注意: Optional parameters must appear after all required parameters. 11 /// </summary> 12 public static void DefaultValue(string name = "画虎", int age = 100) 13 { 14 Console.WriteLine("Name=" + name + " Age=" + age); 15 }
4. 对象和集合的初始化器
1 /// <summary> 2 /// 对象和集合的初始化器。 3 /// </summary> 4 public static void ObjectAndListInit() 5 { 6 // 1. 以前的写法 7 Student stu = new Student(); 8 stu.StudentNo = 001; 9 // 2. 使用对象的初始化器的写法。 10 Student stu2 = new Student(){StudentNo = 002,StudentName = "王五"}; 11 // 3.0 集合的初始化器 12 List<Student> list0 = new List<Student>() 13 { 14 new Student(){StudentName = "狼来了",StudentNo = 001}, 15 new Student(){StudentName = "狼没来",StudentNo = 002} 16 }; 17 // 3.1 以前的写法,其实集合的初始化器通过反编译后的代码和以前的写法一样。 18 List<Student> list = new List<Student>(); 19 list.Add(new Student(){StudentNo = 003,StudentName = "蕾丝"}); 20 }
5. 匿名类
1 /// <summary> 2 /// 匿名类: vs 语法糖 3 /// 1.0 参数个数或参数顺寻不一样会产生一个新的匿名类。 4 /// 2.0 参数顺序一样,但类型不一样,二者共用一个匿名类。 5 /// </summary> 6 public static void AnonymousType() 7 { 8 // 通过反编译可知,其实它会产生一个参数名称和顺序相同的实体类。其中的属性相当于占位符 9 var aType = new {ID=001,Name="西游记"}; 10 }
6,匿名方法到lambda表达式的演变
1 /// <summary> 2 /// 匿名方法: 匿名委托。 3 /// 1. 编译完成后,产生一个私有委托对象, 4 /// 2. 生成和1中相同签名的方法 5 /// </summary> 6 public static void AnonymousMethod() 7 { 8 // 1.0 利用传统的委托传递方法的方式 9 var students = GetStudentList(); 10 //var whereStudents = students.Where(WhereMethod).ToList(); 11 //whereStudents.ForEach(ActionWhere); 12 13 // 2.0 利用匿名委托的方式 14 //var whereStudents = students.Where(delegate(Student stu) { return stu.StudentNo > 0001; }).ToList(); 15 //whereStudents.ForEach(delegate(Student stu) 16 //{ 17 // stu.StudentNo += 1; 18 // stu.StudentName += "(1班)"; 19 // Console.WriteLine(stu.ToString()); 20 //}); 21 22 // 3.0 利用lambda表达式 23 students.Where(s => s.StudentNo > 0001).ToList().Sort((s1, s2) => s1.StudentNo - s2.StudentNo); 24 foreach (Student student in students) 25 { 26 Console.WriteLine(student.ToString()); 27 } 28 } 29 30 private static bool WhereMethod(Student stu) 31 { 32 return stu.StudentNo > 0001; 33 } 34 35 private static void ActionWhere(Student stu) 36 { 37 Console.WriteLine(stu.ToString()); 38 } 39 40 private static List<Student> GetStudentList() 41 { 42 List<Student> list = new List<Student>() 43 { 44 new Student(){StudentName = "zhangshan",StudentNo = 0001}, 45 new Student(){StudentName = "lisi",StudentNo = 0002}, 46 new Student(){StudentName = "wangwu",StudentNo = 0003}, 47 new Student(){StudentName = "laoliu",StudentNo = 0004} 48 }; 49 return list; 50 }
7. 扩展方法
using System; namespace 新语法 { /// <summary> /// 扩展方法的特点: /// 1. 扩展方法所在类为 (static) 静态方法。 /// 2. 扩展方法本身为 静态方法 /// 3. 扩展方法的第一个参数为this,且this 参数不能被out/ref修饰。 /// 4. 扩展自父类的扩展方法会被子类继承。 /// 5. 如果扩展方法和实例方法同名,实例方法有更高优先级。 /// 7. 在使用的类中的命名空间和扩展类说在的命名空间不一致,要先倒入命名空间。 /// 8. 本质: 就是静态类调用本身对应的静态方法。 /// 9. 实例方法可以和实例方法构成重载。 /// </summary> public static class ExtMethodHelper { public static string DateFormater(this DateTime dt) { return dt.ToString("yyyy-MM-dd") + " " + dt.DayOfWeek; } public static string DateFormater(this DateTime dt, string day) { string dayofweek = dt.DayOfWeek.ToString(); switch (dayofweek) { case "Sunday": day = "星期日"; break; } return dt.ToString("yyyy-MM-dd HH:mm:ss") + " " + day; } public static bool IsNullOrEmputy(this string str) { return string.IsNullOrEmpty(str); } } }
8. 四个系统内置委托
public static void SystemDelegate() { var list = GetStudentList(); // 1.0 public delegate TResult Func<in T, out TResult>(T arg); // 2.0 public delegate void Action<in T>(T obj); list.Where(c=>c.StudentName.Contains("z")).ToList().ForEach(c=>Console.WriteLine(c.StudentName)); // 3.0 public delegate bool Predicate<in T>(T obj); Student student = list.Find(c => c.StudentNo == 0001); Console.WriteLine("Predicate "+student.StudentName); // 3.0 public delegate int Comparison<in T>(T x, T y); list.Sort((s1,s2)=>s2.StudentNo-s1.StudentNo); }