C#1-C#4的类型定义方式衍变
C#1的定义类型
在C#1时代,大家常见的类型定义方式通常都是下面这样,可以看到定义一个属性时分别要声明一个小写开头的变量和一个供取值的大写开头的属性,赋值时统一通过构造函数传入
using System.Collections;
public class Book
{
string name;
public string Name{get {return name;} }
decimal price;
public decimal Price{get {return price;} }
public Book(string name,decimal price)
{
this.name = name;
this.price = price;
}
}
当我们需要一组书本的集合时,通常的使用方式如下
public static ArrayList GetBooks()
{
ArrayList list = new ArrayList();
//添加数据
list.Add(new Book("哈利波特与魔法石",50));
list.Add(new Book("围城",20));
//修改数据
Book SpecialBook = new Book("三体",30);
list[0] = SpecialBook;
//移除数据
list.RemoveAt(1);
return list;
}
}
ArrayList继承IList接口,可以很方便的提供数据的添加修改与移除,它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。但是同样ArrayList也有一定的缺陷,它不提供与内部内容有关的编译时信息,所以此时如果在GetBooks中创建列表时添加一个字符串或者数组,编译器并不会报错。
除开ArrayList可以实现集合外,也可以通过继承CollectionBase实现自定义集合类,通过对IList对象进行封装实现强类型集合,不过这种方式太过麻烦,因此不做多赘述。
C#2的强类型集合
作为.NET程序员,最熟悉也最常用的莫过于泛型了,这也是C#2做出的最重要的改变。
强类型集合和私有的赋值方式
public class Book
{
string name;
public string Name
{
get { return name; }
private set { name = value; }
}
decimal price;
public decimal Price
{
get { return price; }
private set { price = value; }
}
public Book(string name, decimal price)
{
Name = name;
Price = price;
}
public static List<Book> GetBooks()
{
List<Book> books = new List<Book>();
books.Add(new Book("哈利波特与魔法石", 50));
Book Special = new Book("三体", 30);
books[0] = Special;
books.Remove(Special);
return books;
}
}
可以看到属性在C#2中拥有了私有的赋值方法,并且List中指定book类型之后再放入其他类型数据时编译器会报错,同时也解决了装箱拆箱造成的性能问题。
C#3的自动实现的属性
相比C#2,属性的实现又省略了一部分代码,不需要再定义小写开头的变量了,代码如下
public class Book
{
public string Name{ get; private set; }
public decimal Price{ get; private set; }
public Book(string name, decimal price)
{
Name = name;
Price = price;
}
}
C#4的命名实参
public class Book
{
public string Name{ get; private set; }
public decimal Price{ get; private set; }
public Book(string name, decimal price)
{
Name = name;
Price = price;
}
public static List<Book> GetBooks()
{
return new List<Book>{new Book{Name="哈利波特与魔法石",Price=50}};
}
}
这里我们可以看到,在初始化对象时可以直接指定输入参数的值了,在C#2中,传参需要根据构造函数的参数顺序进行传参,如果参数一多,则需要不停的翻看,可以指定以后,在编码时将更加的方便。