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中,传参需要根据构造函数的参数顺序进行传参,如果参数一多,则需要不停的翻看,可以指定以后,在编码时将更加的方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值