using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace QueryComplexObject
{
    class Customer
    {
        public string ID     { get; set; }
        public string City   { get; set; }
        public string Country{ get; set; }
        public string Region { get; set; }
        public decimal Sales { get; set; }
        public override string ToString()
        {
           return "ID:" + ID+"  " + "City:" + City+"  " + "Country:" + Country+"  " + "Region:" + Region +"  "+ "Sales:" + Sales;
        }
    }    class Program
    {
        static void Main(string[] args)
        {
            List<Customer> customers = new List<Customer> 
            {
                new Customer { ID = "A", City = "New YorK", Country = "USA", Region = "North USA", Sales = 9999},
                new Customer { ID = "B", City = "MMubLik", Country = "India", Region = "Asia",Sales= 8888},
                new Customer { ID = "C", City = "sdfasf", Country = "UK", Region = "PPa",Sales= 7777},
                new Customer { ID = "D", City = "Mfdg", Country = "Dekl", Region = "Qcia",Sales= 6666},
                new Customer { ID = "E", City = "MhjO", Country = "Dkka", Region = "Aivr",Sales= 5555},
                new Customer { ID = "F", City = "ghjONO", Country = "Pool", Region = "Sdia",Sales= 4444},
                new Customer { ID = "G", City = "cvNO", Country = "Ekkiv", Region = "Parti",Sales= 3333},
                new Customer { ID = "H", City = "Palu", Country = "CllKu", Region = "Lric",Sales= 2222},
                new Customer { ID = "I", City = "Mosco", Country = "Drro", Region = "Ytile",Sales= 1111},
                new Customer { ID = "G", City = "Seml", Country = "Swrit", Region = "Hikru",Sales= 1000},
                new Customer { ID = "K", City = "Mdsf", Country = "Adfin", Region = "Sxia",Sales= 2000},
                new Customer { ID = "L", City = "istan", Country = "Cink", Region = "Nikal",Sales= 3000},
                new Customer { ID = "M", City = "Shanghai", Country = "Asdsd", Region = "Lusia",Sales= 4000},
                new Customer { ID = "N", City = "Wuhai", Country = "Gfgf", Region = "Srima",Sales= 5000},
                new Customer { ID = "O", City = "Dalian", Country = "Efhj", Region = "Vgen",Sales= 6000},
                new Customer { ID = "P", City = "Mexige", Country = "Bddfg", Region = "Waga",Sales= 7000},
                new Customer { ID = "Q", City = "LLucy", Country = "Ehjgh", Region = "Ericsi",Sales= 8000},
                new Customer { ID = "R", City = "London", Country = "Ffghfg", Region = "Fulli",Sales=9000},
                new Customer { ID = "S", City = "Bejing", Country = "Cdsfdf", Region = "Jicci",Sales= 1001},
                new Customer { ID = "T", City = "Limas", Country = "IOll", Region = "Malli",Sales= 2000},        };
            var queryResult = from c in customers where c.Region == "Asia" select c;
            Console.WriteLine("Customers in Asic");
            foreach (Customer cs in queryResult)
            {
                Console.WriteLine(cs);
            }
            Console.WriteLine("press anykey to go out");
            Console.ReadKey();        }
    }
}
首先是那个重写的方法ToString(),我怎么就没见这个方法被显示调用啊?但是知道去掉肯定不行,否则Console.writeLine(cs)就输出全变成了
“ 命名空间.Customer”这种类型了(测试的),输出函数Console.writeLine是怎么调用ToString()的?另外就是定义的那几个属性,例如
public string ID     { get; set; }  ,我把它们变成 成员变量public string ID ,运行程序也是一样的结果。我想问的是在这里使用属性有什么好处。
谁能深入显出的文字表述下属性那?问的问题有点多,多加点分,希望好心人平和的回答。

解决方案 »

  1.   

    ToString是Object的方法,默认的实现是返回类型信息,相当于GetType().ToString()Console.WriteLine(cs),WriteLine内部会调用cs.ToString,
    如果Customer 没有重写ToString,那么cs.ToString得到的是Customer 类型信息
    属性的好处我举个例子。
    直接用public string Gender成员变量来保存性别,那么别人的代码会这么调用:
    string gender = cs.Gender;
    现在,为了节省空间,要求性别用bool型表示
    则Gender成员变量修改成public bool Gender,这样一来,所有调用了Gender的代码都要改动,假如是这样
    private string gender;//成员变量
    public string Gender{get{return gender;}}//属性
    别人这么调用string gender = cs.Gender;
    当gender 改成bool,我们只需修改属性
    public string Gender{get{if(gender)return "男";else return "女";}}
    所有别人的调用代码都不需改动public string ID    { get; set; } 实际上是一种简化写法,编译器自动生成成员变量
      

  2.   

    ToString是Object的默认调用方法,得到实例对象的信息
    重写ToString方法,可以改变默认的返回情况,指定需要返回的处理语句
      

  3.   

    Console.writeLine(cs)里面会处理成 cs.ToString()
    属性有很多好处
    1可以设定访问修饰符
    如果你不想让别人能够修改ID就写成 publc string ID{get; private set;}
    等等
    2.可以在属性使用的时候添加处理语句
    public string ID
    {
       get
    {
     Console.Writeline("ID");
     return _id;
    }
    set
    {
       _id = value;
       CONSOLE.WRITELINE("ID");
    }
    }
    等等
      

  4.   

    第一个问题:Console.writeLine是怎么调用ToString()的?这是通过StringBuilder的Append()方法和AppendFormat()方法来实现的。
    如果类实现了IFormattable接口,AppendFormat()方法就调用IFormattable接口的方法
    否则调用类的 Tostring()方法!
    这个问题的详细解答,你可以参考《C#高级编程》第六版 第八章(190页)第二个问题:另外就是定义的那几个属性;public string ID(get;set;) 是C#3.0的写法,它等价于private string _id;public string ID
    {
      get
      {
        retrun_ID;
      }
      set
      {
        _id=value;
      }
    }这样写,也许能方便看出它和public string ID区别了至于用属性的好处有很多,《effictive C#》第一节就讲了这个问题
    另外可以参考
      

  5.   

    首先是那个重写的方法ToString(),我怎么就没见这个方法被显示调用啊?
    开始的时候string方法并没有被传值,所以你无法使用override方法进行覆盖。
    所以就无法调用。