深入理解 c# 第十一章 方法调用的查询表达式

    class ShowAllUsersMethodCall
    {
        static void Main()
        {
            var query = SampleData.AllUsers.Select(user => user);
//query System.Linq.Enumerable.WhereSelectListIterator
            foreach (var user in query)//先是foreach 之后是query 
			//后面是in  调用user => user 返回in 调用varchar  
			//调用一次in 就调用 user => user , 最后一次是退出循环
			//var user的值{User: Tim Trotter (Tester)}  赋值完就WriteLine
			//{User: Tara Tutu (Tester)}
			//{User: Deborah Denton (Developer)}
			//{User: Darren Dahlia (Developer)}
			//{User: Mary Malcop (Manager)}
			//{User: Colin Carton (Customer)}
			
            {
                Console.WriteLine(user);//调用重写的ToString方法
            }
        }
    }
	
    public class User
    {
        public string Name { get; set; }
        public UserType UserType { get; set; }

        public User (string name, UserType userType)
        {
            Name = name;
            UserType = userType;
        }

    public override string ToString()
    {
            return string.Format("User: {0} ({1})", Name, UserType);
    }
}	

	 public static IEnumerable<User> AllUsers
     {
         get { return users; }
     }
     public static class Users
     {
         public static readonly User TesterTim = new User("Tim Trotter", UserType.Tester);
         public static readonly User TesterTara = new User("Tara Tutu", UserType.Tester);
         public static readonly User DeveloperDeborah = new User("Deborah Denton", UserType.Developer);
         public static readonly User DeveloperDarren = new User("Darren Dahlia", UserType.Developer);
         public static readonly User ManagerMary = new User("Mary Malcop", UserType.Manager);
         public static readonly User CustomerColin = new User("Colin Carton", UserType.Customer);
     }
		
	public enum UserType : byte
    {
        Customer,
        Developer,
        Tester,
        Manager,
    }


编译器转译是查询表达式基础的转译
  编译器把查询表达式转译为普通的C#代码,这是支持C#3查询表达式的基础。
它是以一种机械的方式来进行转换的,不会去理解代码、应用类型引用、检查
方法调用的有效性或执行编译器要执行的任何正常工作。这些都在转换完成之后
来执行。
  c#3编译器进一步正确地编译查询表达式之前,就把它转译为了这样的代码。
特别地,它不会假定应该使用Enumerable.Select,还是List<T>应该包含
一个Select方法调用。它只是对代码进行转译,并让下一个编译阶段来处理查找
适当方法的工作---不管这个方法是直接包含的成员,还是扩展方法。参数是一个
适当的委托类型或者一个和类型T对应的Expression<T>。

  Lambda表达式能被转换为委托实例和表达式树。


输出
User: Tim Trotter (Tester)
User: Tara Tutu (Tester)
User: Deborah Denton (Developer)
User: Darren Dahlia (Developer)
User: Mary Malcop (Manager)
User: Colin Carton (Customer)

猜你喜欢

转载自blog.csdn.net/eyetired/article/details/80035919