您的位置:首页 > 编程语言 > C#

C#开发的进化史(从简单的数据类型开始)

2015-11-03 14:38 211 查看
将从定义一个Product类开始,封装几个属性。讲述C#1---C#4的进化过程:
一、C#1 只读属性,弱类型集合
#region C# 1
public class Product
{
string name;
decimal price;
public string Name { get { return name; } }
public decimal Price { get { return price; } }
public Product(string name, decimal price)
{
this.name = name;
this.price = price;
}

public static ArrayList GetList()
{
ArrayList list = new ArrayList();
list.Add(new Product("Orange", 12.3m));
list.Add(new Product("Apple", 10m));
return list;
}

public override string ToString()
{
return string.Format("{0},{1}", name, price);
}
}
#endregion


问题一:创建属性和变量的代码很复杂

问题二:代码为属性提供了公共的取值方法,如果添加对应的赋值方法,那Set就必须是公共的

问题三:ArrayList没有对类型进行限制,如果赋值的时候随便添加一个字符串,编译器并没有报错。例如GetList中list.Add("I am String type"),编译器也一样通过了

二、C#2 私有属性赋值方法,强制类型集合:

#region C# 2
public class Product2
{
string name;
decimal price;
public string Name { get { return name; } private set{name=value;}}
public decimal Price {get { return price; } private set{price=value;}}
public Product2(string name, decimal price)
{
Name = name;
Price = price;
}

public static List<Product2> GetList()
{
List<Product2> list = new List<Product2>();
list.Add(new Product2("Orange", 12.3m));
list.Add(new Product2("Apple", 10m));
return list;
}

public override string ToString()
{
return string.Format("{0},{1}", name, price);
}
}
#endregion


解决了C#1中的

问题二:属性拥有私有的赋值方法,注意看构造方法,使用了私有赋值的方法。

问题三:规定了这个List只能存Product2,,假如添加了不同类型到list中编译器就会报错。例如GetList()中list.Add("different data type"),编译器就会报错。

三、C#3 自动实现属性的Set和Get方法,增强集合和对象的初始化:

#region C# 3
public class Product3
{
public string Name { get; private set; }
public decimal Price { get; private set; }
public Product3(string name, decimal price)
{
Name = name;
Price = price;
}

Product3() { }

public static List<Product3> GetList()
{
return new List<Product3>{
new Product3("Orange",12.3m),
new Product3("Apple", 10m)
};
}

public override string ToString()
{
return string.Format("{0},{1}", Name, Price);
}
}
#endregion


从代码看得出属性的get和set方法变得非常简便,集合的初始化也变得非常方便

四、C#4 命名实参:

当一个类的属性特别多的时候,用构造函数初始化的时候比较难看懂属性之前的对应关系。C#4中提供了命名实参,例如构造初始化时可以这样写 new Product4( price:12.3m,name:"Orange"),给参数命名赋值。

#region C# 4
public class Product4
{
readonly string name;
readonly decimal price;
public string Name { get { return name; } }
public decimal Price { get { return price; } }
public Product4(string name, decimal price)
{
this.name = name;
this.price = price;
}

public static List<Product4> GetList()
{
return new List<Product4>{
new Product4( price:12.3m,name:"Orange"),
new Product4("Apple", 10m)
};
}

public override string ToString()
{
return string.Format("{0},{1}", name, price);
}
}
#endregion


这是今天看到的,所以记录下来。写的不是很好,可能还有很多错误,希望大神指正。参考Depth in C sharp


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: