在实际开发中或许可能会遇到某个属性需要提供一个默认参数,如果该参数是引用类型的话,可以通过 使用 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. Linux环境搭建 | 手把手教你配置Linux虚拟机

    在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度. Ubuntu刚安装完毕之后,还无法进行开发 ...

  2. 以太坊智能合约[ERC20]发币记录

    以太坊被称为区块链2.0,就是因为以太坊在应用层提供了虚拟机,使得开发者可以基于它自定义逻辑,通常被称为智能合约,合约中的公共接口可以作为区块链中的普通交易执行.本文就智能合约发代币流程作一完整介绍( ...

  3. CAD数据分块,偏移校准,加载到百度地图、高德地图、谷歌等地图上

    前面分享过一篇如何将CAD海量数据显示在百度地图上(百度地图Canvas实现十万CAD数据秒级加载),但是很多开发者在CAD数据提取时遇到了问题,所以接下来的文章将介绍如何将CAD数据提取. 准备软件 ...

  4. Java连载26-方法(语法结构)

    一.方法 1.返回值类型如果不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法执行结束的时候没有返回任何数值,编译器会报错,怎么返回值呢?并且要求“值”的数据类型必须和“方法的返回值 ...

  5. [python]创建文本文件,并读取

    代码如下: # coding=gbk import os fname = raw_input("Please input the file name: ") print if os ...

  6. HDU - 4009 - Transfer water 朱刘算法 +建立虚拟节点

    HDU - 4009:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意: 有n户人家住在山上,现在每户人家(x,y,z)都要解决供水的问题,他可以自己 ...

  7. 从SpringBoot构建十万博文聊聊Tomcat集群监控

    前言 在十万博文终极架构中,我们使用了Tomcat集群,但这并不能保证系统不会出问题,为了保证系统的稳定运行,我们还需要对 Tomcat 进行有效的运维监控手段,不至于问题出现或者许久一段时间才知道. ...

  8. 用户上传gif动图分解成多张帧图片,并合并生成新gif图片

    背景 为什么要制作这么一款工具 首先公司最近在做一款表情包的产品,需要将文字生成到gif图片中,并可以控制文字显示的位置,并将不同的文字显示在不同的图片上 制作成网页端工具,随时随地,方便使用 探索 ...

  9. SpringBoot整合ActiveMQ,看这篇就够了

    ActiveMQ是Apache提供的一个开源的消息系统,完全采用Java来实现,因此它能很好地支持JMS(Java Message Service,即Java消息服务)规范:本文将详细介绍下Activ ...

  10. java第一次测验

    package kaoshi; import java.util.Scanner; public class ScoreManagement { static int t=0; static int ...