打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#特性之数据类型


这篇文章主要通过演示类在不同发展中的不通过定义方法,来向读者表述它们之间的区别和联系。


在C#1时代,我们喜欢这样定义类:


public class Product
{
private string _name;
public string Name {
get { return _name; }
}

private decimal _price;
public decimal Price
{
get { return _price; }
}

public Product(string name, decimal price)
{
this._name = name;
this._price = price;
}

public static ArrayList GetArrayList()
{
ArrayList list = new ArrayList();
list.Add(new Product('WindowsPhone', 10m));
list.Add(new Product('Apple', 10m));
list.Add(new Product('Android', 10m));

return list;
}

public override string ToString()
{
return String.Format('{0}--{1}', _name, _price);
}
}


局限性:


1、ArrayList没有提供与其内部内容有关的编译时信息,如果不慎写错,编译器也不会出现任何提示;


2、代码中为属性提供了公共的取值方法,这意味着如果添加对应的赋值方法,那么赋值方法必须是共有的;


3、用于创建属性和变量的代码很复杂,这违背了我们进行封装的原本意愿;


在C#2时代,我们喜欢这样定义类:


public class Product
{
private string _name;
public string Name {
get { return _name; }
private set { _name = value; }
}

private decimal _price;
public decimal Price
{
get { return _price; }
private set { _price = value; }
}

public Product(string name, decimal price)
{
Name = name;
Price = price;
}

public static List GetArrayList()
{
List list = new List();
list.Add(new Product('WindowsPhone', 10m));
list.Add(new Product('Apple', 10m));
list.Add(new Product('Android', 10m));

return list;
}

public override string ToString()
{
return String.Format('{0}--{1}', Name, Price);
}
}


现在,属性拥有了私有的赋值方法,并且它能非常聪明的“猜出”List是告知编译器列表中只能包含Product。


试图将一个不同类型添加到列表中会造成编译时错误,并且当你从列表中获取结果时,也并不需要转化结果的类型;有效的解决了C#1中的前两个问题;


在C#3时代,我们喜欢这样定义类:


public class Product
{
public string Name
{
get; private set;
}

public decimal Price
{
get; private set;
}

public Product(){}

public static List GetArrayList()
{
return new List()
{
new Product {Name = 'WindowsPhone', Price = 10m},
new Product {Name = 'Apple', Price = 10m},
new Product {Name = 'Android', Price = 10m}
};
}

public override string ToString()
{
return String.Format('{0}--{1}', Name, Price);
}
}


发展到这个阶段,我们可以很明显的发现,不再有任何代码(或者可见的变量)与属性关联,而且硬编码的列表是以一种全然不同的方式构建,这样一来,我们实际上是完全可以删除就有的构造函数,但是外部代码就不能再创建其他的产品实例。自动熟悉大大简化了操作;


在C#4时代,我们喜欢这样定义类:


public class Product
{
private readonly string _name;

public string Name
{
get { return _name; }
}

private readonly decimal _price;

public decimal Price
{
get { return _price; }
}

public Product(string name,decimal price)
{
this._name = name;
this._price = price;
}

public static List GetArrayList()
{
return new List()
{
new Product(name: 'WindowsPhone', price: 10m),
new Product(name: 'Apple', price: 10m),
new Product(name: 'Android', price: 10m)
};
}

public override string ToString()
{
return String.Format('{0}--{1}', Name, Price);
}
}



在这个特定的示例中,C#4的特性的好处还不是很明显,但当方法或构造函数包含多个参数时,它可以是代码的含义更加清-特别是当参数类型相同,或某个参数为null时。当然,你可以选择什么时候使用该特性,只在是代码更好的理解时才指定参数的名称;


总结:

C#1(只读属性,弱类型集合)------>C#2(私有属性赋值方法,强类型集合)------>C#3(自动实现的熟悉,增强的集合和对象初始化)------>C#4(用命名实参更清晰的调用构造函数和方法)

注:由于C#5在这方面的特性表现的没有太大变化,所以就不再表述。


来源:hippieZhou

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
实现Comparable接口,进行排序
集合排序
POI导出EXCEL经典实现
spring通过get和set方法bean注入(方法一)
Java图书信息查询
Java按照List内存储的对象的某个字段进行排序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服