在实际开发中或许可能会遇到某个属性需要提供一个默认参数,如果该参数是引用类型的话,可以通过 使用 null 来表示未知的值,但如果是int或 其他值类型的话就有点不好办了,因为如果需要一个int或float表示一个未知数是比较麻烦的(尤其是查询数据库查询到的数据),假设

    class Program
    {
        static void Main(string[] args)
        {
            Product p = new Product();
            Console.WriteLine(p.Price);
        }
    }
    class Product
    {
        public int ID { get; set; }
        public string ProductName { get; set; }
        public float Price { get; set; }
    }

我有一个产品 Product ,如果该产品 已上市,那么 他对应的价格肯定是 0 - max ,那么问题来了,如果该产品没上市,用一个float 怎么表示 该产品没有价格。

所以.Net 2.0 引入了 Nullable<T>  ----- 可空类型 ,在 原类型后面 加上 ? 表示可空类型 ,其默认值 就变成了null 了,那么解决上面的问题就好解决多了。

 class Program
    {
        static void Main(string[] args)
        {
            Product p = new Product();
            Console.WriteLine(p.Price);
        }
    }
    class Product
    {
        public int ID { get; set; }
        public string ProductName { get; set; }
        public float? Price { get; set; }
    }

然后运行可以看到 在不给P 的price 属性赋值的情况下 p.price 是 为 null 的 。

那么,问题又来了(哈哈,问题总是一个接一个)

如果我希望,在 实例化 product 的时候 给属性一个默认值呢?

按以前的做法是 给个构造函数的 重载,这样确实是可以解决该问题,但是不必要的代码也添加了许多

例如

   class Program
    {
        static void Main(string[] args)
        {
            Product p = new Product();
            Product p2 = , "name", 1.5f, "该商品没任何描述");
            Product p3 = , "name2", 2.5f, "该商品没任何描述");
        }
    }
    class Product
    {
        public Product() { }
        public Product(int ID,string ProductName,float Price,string Desc)
        {
            this.ID = ID;
            this.ProductName = ProductName;
            this.Price = Price;
            this.Desc = Desc;
        }
        public int ID { get; set; }
        public string ProductName { get; set; }
        public float? Price { get; set; }
        public string Desc { get; set; }
    }

可以看到,我们添加了构造函数后 确实是可以给个默认值了,那么如果我只需要其中的 两个参数 初始化,其他都保持默认值呢?

是不是又要添加对应的 构造函数,如果遇到 属性的 扩充,那么对应构造函数个数什么的 也要变更

所以C # 4 中可以为 属性 提供一个默认值,如下

  class Program
    {
        static void Main(string[] args)
        {
            Product p = new Product();
            Product p2 = ,"name",1.0f);
            Model2 m2 = new Model2();

        }
    }

    class Product
    {
        ,string ProductName = "DefaultName",float Price = 1.0f, string Desc = "该商品没有和描述")
        {
            this.ID = ID;
            this.ProductName = ProductName;
            this.Price = Price;
            this.Desc = Desc;
        }

        public int ID { get; set; }
        public string ProductName { get; set; }
        public float? Price { get; set; }
        public string Desc { get; set; }
    }

可以看到 我实例化了 一个 Product  p,并没有给任何一个参数,他的默认值就是 构造函数中给的默认值,

p2 没有给他提供 Desc 熟悉的 初始化,但他的默认值就是 “该商品没有描述”,是不是方便了很多

C#深入学习中,共勉

C#深入学习笔记 - 可空类型与构造函数默认参数的更多相关文章

  1. java学习笔记01--数据类型

    java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...

  2. Hadoop学习笔记—5.自定义类型处理手机上网日志

    转载自http://www.cnblogs.com/edisonchou/p/4288737.html Hadoop学习笔记—5.自定义类型处理手机上网日志 一.测试数据:手机上网日志 1.1 关于这 ...

  3. C#学习笔记之值类型与引用类型

    [TOC] C#学习笔记之值类型与引用类型 1.值类型与引用类型 1.1 深层区别 值类型与引用类型有不同的内存分布,这导致了不同的内存管理机制: 值类型由OS负责内存管理 引用类型由垃圾回收器(GC ...

  4. WebGL three.js学习笔记 6种类型的纹理介绍及应用

    WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...

  5. [读书笔记]C#学习笔记三: C#类型详解..

    前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...

  6. C#学习笔记二: C#类型详解

    前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...

  7. TypeScript学习笔记之基础类型

    从今天开始学习typescript了,记录ts学习点滴,最后,使用ts结合nodejs开发后端应用,一起共勉吧: typescript最新版本2.6,所有演示代码均基于此版本 开始之前确定安装了如下n ...

  8. matlab学习笔记10_7数值计算类型和常用计算公式

    一起来学matlab-matlab学习笔记11 数值数据类型以及特殊函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...

  9. Thrift学习笔记—IDL基本类型

    thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,并通过生成不同的语言代理实现来达到跨语言.平台的功能.在thrift的IDL中可以定义以下一 ...

随机推荐

  1. shell习题2

    1---------------->>>>输入一个设备文件,输出这个设备文件的基本信息: 2.------------->>>>显示一个如下的菜单,cp ...

  2. 【码上开心】Windows环境mysql数据库使用(二)skip-grant-tables 与用户名密码修改

    skip-grant-tables #跳过数据库权限验证 我们安装MySql 设置my.ini配置文件的时候,常常会在my.ini中添加 skip-grant-tables ,这时接数据库可以使用任意 ...

  3. Delphi - Windows自动计划任务与ParamStr详解

    Windows自动计划任务与ParamStr详解 ParamStr函数: ParamStr(1),..ParamStr(N) ParamStr(1)代表程序入口的第一个参数,同理,ParamStr(N ...

  4. Mybatis案例升级版——小案例大道理

    纯Mybatis案例升级版——小案例大道理 前言: 这几天看了一本书<原则>,在上面看到了一句话叫“每个人都把自己眼界的局限当成世界的局限”,大学生是

  5. P2486 [SDOI2011]染色 维护区间块数 树链剖分

    https://www.luogu.org/problemnew/show/P2486   题意 对一个树上维护两种操作,一种是把x到y间的点都染成c色,另一种是求x到y间的点有多少个颜色块,比如11 ...

  6. codeforces 509 D. Restoring Numbers(数学+构造)

    题目链接:http://codeforces.com/problemset/problem/509/D 题意:题目给出公式w[i][j]= (a[i] + b[j])% k; 给出w,要求是否存在这样 ...

  7. poj 2649 Factovisors 对n!进行因数分解

    Factovisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4431   Accepted: 1086 Descr ...

  8. IDEA 中用好 Lombok,撸码效率至少提升5倍!

    来 源:http://t.cn/EXhxRzV 以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString:异常处理:I/O流的关闭操作等等,这些样板代码既没 ...

  9. 让docker中的mysql启动时自动执行sql

    在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了. 其实mysql的官 ...

  10. Ubuntu16.4安装Vivado Design Suite sdx2019.1

    1:下载安装包.到Xilinx官网下载下面为网址: https://www.xilinx.com/support/download.html 2:进入安装包路径,打开终端 Ctrl+alt +t sh ...