[基础] 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         }
匿名方法到lambda表达式

 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);
        }
系统内置委托

 

posted on 2015-03-08 21:38  Mr.YM  阅读(194)  评论(5编辑  收藏  举报

导航