首先我发现在我了解了C#这几个版本如何进化的后,我真心觉得以前写的代码都是用的C#1.0啊,感觉自己太落后,太低端了。
这些是我看了《深入理解C#》后得到的。
我们来看看C#几个版本写的一个类。
C#1.0:
3个缺点
using System.Collections;
class C1
{
//(1)此处创建属性和变量的代码过于复杂
string name;
public string Name { get { return name; } }
//(2)为属性提供的公共取值方法,那么如果添加赋值方法则也是公共的
int age;
public int Age{get{return age;}}
public C1(string name, int age)
{
this.name = name;
this.age = age;
}
public static ArrayList GetSampleProduct()
{
//(3)list中可以添加其他类型的值也不会报错
ArrayList list = new ArrayList();
list.Add(new C1("Tom", 21));
list.Add(new C1("Jerry", 32));
list.Add(new C1("Sam", 14));
list.Add(new C1("Lorwy", 22));
return list;
}
public override string ToString()
{
//return base.ToString();
return string.Format("{0}:{1}", Name, Age);
}
static void Main(string[] args)
{
ArrayList list = C1.GetSampleProduct();
foreach (C1 c in list)
{
Console.WriteLine(c.ToString());
}
Console.ReadLine();
}
}
C#2.0:
粗体为改动代码
class C2
{
string name;
public string Name
{
get { return name; }
private set { name = value; }//属性拥有了私有的赋值方法,并在构造函数中用到
}
int age;
public int Age
{
get { return age; }
private set { age = value; }
}
public C2(string name, int age)
{
Name = name;
Age = age;
}
public static
List<C2> GetSampleProduct()
{
//利用泛型是编译器能知道List<C2>告诉它该列表中只能存储C2类型的对象
List<C2> list = new List<C2>();
//ArrayList list = new ArrayList();
list.Add(new C2("Tom", 21));
list.Add(new C2("Jerry", 32));
list.Add(new C2("Sam", 14));
list.Add(new C2("Lorwy", 22));
return list;
}
public override string ToString()
{
//return base.ToString();
return string.Format("{0}:{1}", name, age);
}
static void Main(string[] args)
{
List<C2> list = C2.GetSampleProduct();
//C1 c = null;
foreach (C2 c in list)
{
Console.WriteLine(c.ToString());
}
Console.ReadLine();
}
}
C#3.0:
class C3
{
string name;
public string Name
{
//自动实现的属性
get;
private set;
}
int age;
public int Age
{
get;
private set;
}
public C3()
{
}
public static List<C3> GetSampleProduct()
{
//更简单的初始化
return new List<C3>
{
new C3{Name="Tom", Age=21},
new C3{Name="Jerry",Age=32},
new C3{Name="Sam", Age=14},
new C3{Name="Lorwy", Age=22}
};
}
public override string ToString()
{
//return base.ToString();
return string.Format("{0}:{1}",
Name, Age);
}
static void Main(string[] args)
{
List<C3> list = C3.GetSampleProduct();
foreach (C3 c in list)
{
Console.WriteLine(c.ToString());
}
Console.ReadLine();
}
}
C#4.0:
//当方法或构造函数包含多个参数时可以使代码更清楚
class C4
{
readonly string name;
public string Name{get{return name;} }
readonly int age;
public int Age { get { return age; } }
public C4(string name,int age)
{
this.name = name;
this.age = age;
}
public static List<C4> GetSampleProduct()
{
return new List<C4>
{
new C4(name:"Tom", age:21),
new C4(name:"Jerry",age:32)
new C4(name:"Sam", age:14),
new C4(name:"Lorwy",age:22)
};
}
public override string ToString()
{
//return base.ToString();
return string.Format("{0}:{1}", Name, Age);
}
static void Main(string[] args)
{
List<C4> list = C4.GetSampleProduct();
foreach (C4 c in list)
{
Console.WriteLine(c.ToString());
}
Console.ReadLine();
}
}
几个版本之间的进化图:
C#1.0:按名字排序
class PeopleNameComparer : IComparer
{
public int Compare(object x, object y)
{
C1 first = (C1)x;
C1 second = (C1)y;
return first.Name.CompareTo(second.Name);
}
}
class C1
{
//(1)此处创建属性和变量的代码过于复杂
string name;
public string Name { get { return name; } }//(2)为属性提供的公共取值方法,那么如果添加赋值方法则也是公共的
int age;
public int Age { get { return age; } }
public C1(string name, int age)
{
this.name = name;
this.age = age;
}
public static ArrayList GetSampleProduct()
{//(3)list中可以添加其他类型的值也不会报错
ArrayList list = new ArrayList();
list.Add(new C1("Tom", 21));
list.Add(new C1("Jerry", 32));
list.Add(new C1("Sam", 14));
list.Add(new C1("Lorwy", 22));
return list;
}
public override string ToString()
{
//return base.ToString();
return string.Format("{0}:{1}", Name, Age);
}
static void Main(string[] args)
{
ArrayList list = C1.GetSampleProduct();
list.Sort(new PeopleNameComparer());
foreach (C1 c in list)
{
Console.WriteLine(c.ToString());
}
Console.ReadLine();
}
}
C#2:按名字排序,引入泛型后
class PeopleNameComparer : IComparer<C2>
{
public int Compare(C2 x, C2 y)
{
C2 first = (C2)x;
C2 second = (C2)y;
return first.Name.CompareTo(second.Name);
}
}
class C2
{
string name;
public string Name
{
get { return name; }
private set { name = value; }//属性拥有了私有的赋值方法,并在构造函数中用到
}
int age;
public int Age
{
get { return age; }
private set { age = value; }
}
public C2(string name, int age)
{
Name = name;
Age = age;
}
public static List<C2> GetSampleProduct()
{//利用泛型是编译器能知道List<C2>告诉它该列表中只能存储C2类型的对象
List<C2> list = new List<C2>();
//ArrayList list = new ArrayList();
list.Add(new C2("Tom", 21));
list.Add(new C2("Jerry", 32));
list.Add(new C2("Sam", 14));
list.Add(new C2("Lorwy", 22));
return list;
}
public override string ToString()
{
//return base.ToString();
return string.Format("{0}:{1}", name, age);
}
static void Main(string[] args)
{
List<C2> list = C2.GetSampleProduct();
list.Sort(new PeopleNameComparer());
foreach (C2 c in list)
{
Console.WriteLine(c.ToString());
}
Console.ReadLine();
}
}
也可以用这句话直接代替IComparer接口
list.Sort(delegate(C2 x, C2 y)
{ return x.Name.CompareTo(y.Name); });
C#3.0中用Lambda表达式
进一步用Lambda表达式来代替
list.Sort((x,y)=>x.Name.CompareTo(y.Name));
按序取得内容,列表的实际顺序并未发生变化,其中之所以能调用OrderBy方法,是因为存在一个扩展方法
foreach (C2 c in list.OrderBy(x=>x.Name))
{
Console.WriteLine(c.ToString());
}