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<Product> GetArrayList()
        {
            List<Product> list = new List<Product>();
            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>是告知编译器列表中只能包含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<Product> GetArrayList()
        {
            return new List<Product>()
            {
                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<Product> GetArrayList()
        {
            return new List<Product>()
            {
                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

出处:https://www.cnblogs.com/hippieZhou/p/4527818.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

Find Anyway

posted @   hippieZhou  阅读(1622)  评论(5编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题