在实际开发中或许可能会遇到某个属性需要提供一个默认参数,如果该参数是引用类型的话,可以通过 使用 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. C笔记_常用快捷键

    1.第一部分 Ctrl + up/down 以光标所在行为中心上下移动文本: Ctrl + left/right 左右跳过一个单词或符号: Ctrl + end 跳至文本末尾: Ctrl + dele ...

  2. 随笔编号-01 如何比较日期类型的String 大小浅谈.

    有三种解决方法: 第一种直接用字符串类的compareTo方法: String t1="20160707"; String t2="20160708"; int ...

  3. MySQL数据库安装步骤

    目录 MySQL数据库安装 MySQL数据库安装 MySQL Windows下载地址:https://dev.mysql.com/downloads 我们这里选择5.6.45版本下载,下载zip. 点 ...

  4. 2019icpc南京网络赛_F_Greedy Sequence

    题意 题意不明,队友告诉我对于每个\(i\),所在下标\(p[i]\),在\([p[i]-k,p[i]+k]\)中找到小于\(i\)的最大数\(x\),然后\(ans[i]=ans[x]+1\)即可. ...

  5. Ubuntu16.04中用yolov3训练自己的数据集

    一.配置yolo v3 参考yolo v3官网https://pjreddie.com/darknet/yolo/ 下载darknet后进行编译: git clone https://github.c ...

  6. ResourceManager基本职能和内部架构

    YARN也采用了Master/Slave结构,其中,Master实现为ResourceManager,负责整个集群资源的管理与调度:Slave实现为NodeManager,负责单个节点的资源管理与任务 ...

  7. Js 组合键

    同时按Ctrl+Enter或Alt+s 先上html代码 <style type="text/css"> #box{width: 500px; height: 500p ...

  8. 洛谷 P3627 【抢掠计划】

    题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...

  9. C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性

    系列目录     [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...

  10. codeforces 1041 E. Tree Reconstruction 和度数有关的构造树

    CF 1041E:http://codeforces.com/contest/1041/problem/E 题意: 告诉你一个树的节点个数,显然有n-1条边.已知去掉一条边后,两个集合中最大的节点值. ...