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

将从定义一个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



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值