C#深入学习笔记 - 可空类型与构造函数默认参数
在实际开发中或许可能会遇到某个属性需要提供一个默认参数,如果该参数是引用类型的话,可以通过 使用 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#深入学习笔记 - 可空类型与构造函数默认参数的更多相关文章
- java学习笔记01--数据类型
java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...
- Hadoop学习笔记—5.自定义类型处理手机上网日志
转载自http://www.cnblogs.com/edisonchou/p/4288737.html Hadoop学习笔记—5.自定义类型处理手机上网日志 一.测试数据:手机上网日志 1.1 关于这 ...
- C#学习笔记之值类型与引用类型
[TOC] C#学习笔记之值类型与引用类型 1.值类型与引用类型 1.1 深层区别 值类型与引用类型有不同的内存分布,这导致了不同的内存管理机制: 值类型由OS负责内存管理 引用类型由垃圾回收器(GC ...
- WebGL three.js学习笔记 6种类型的纹理介绍及应用
WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...
- [读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- C#学习笔记二: C#类型详解
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- TypeScript学习笔记之基础类型
从今天开始学习typescript了,记录ts学习点滴,最后,使用ts结合nodejs开发后端应用,一起共勉吧: typescript最新版本2.6,所有演示代码均基于此版本 开始之前确定安装了如下n ...
- matlab学习笔记10_7数值计算类型和常用计算公式
一起来学matlab-matlab学习笔记11 数值数据类型以及特殊函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- Thrift学习笔记—IDL基本类型
thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,并通过生成不同的语言代理实现来达到跨语言.平台的功能.在thrift的IDL中可以定义以下一 ...
随机推荐
- springcloud(九):熔断器Hystrix和Feign的全套应用案例(二)
一.. 创建Eureka-Server 服务中心项目 1. 创建Eureka-Server 服务中心项目架构如下 2. pom.xml <dependencies> <depende ...
- Selenium3 + Python3自动化测试系列六——等待方式
等待 一.等待是什么,为什么要等待 在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等, 这时候,我们就需要使用等待,来判断上一步操 ...
- 详解golang net之transport
关于golang http transport的讲解,网上有很多文章读它进行了描述,但很多文章讲的都比较粗,很多代码实现并没有讲清楚.故给出更加详细的实现说明.整体看下来细节实现层面还是比较难懂的. ...
- JVM宏观认知&&内存结构
JVM宏观认知 1.什么是虚拟机? 虚拟机是一种软件. 可分为系统虚拟机(仿真物理机)和程序虚拟机(执行单个计算机程序,比如JVM). 2.什么是Java虚拟机(JVM)? JVM是一种将字节码转化为 ...
- 从零开始搭建Java开发环境第一篇:Java工程师必备软件大合集
1.JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 目前主流的JDK版 ...
- rocketmq 部署启动指南-Docker 版
最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及这个过程踩到的一些坑. 准备工作 在搭建之前,我们需要做一些准备工作,这里我们需要使用 ...
- 别说你不会开发exe程序,拿走不谢。
本文重点介绍如何将我们写的java代码打包成在电脑上可以运行的exe文件 本文重点介绍如何将我们写的java代码打包成在电脑上可以运行的exe文件.这里只介绍直接打包成exe的方法,至于打包成exe安 ...
- 从入门到入土的JS 随笔day02 新手向
讲讲自增自减和循环语句及三元一次表达式: 一.自增自减实际上就是按照顺序来解读代码, 例如,a++;代表了a先进行了计算,运算完毕后,才进行增加: ++a呢,则是先进行了自增,值加一后再进行运算: 如 ...
- 【管理学】SMART
- os.linesep提取当前平台使用的换行符
1. unix平台的换行符:\n 2.DOS/Win32平台的换行符:\r\n 3.通过os.linesep函数可以提取当前所处平台的换行符,从而实现不需要关注程序运行在什么平台,也不需要根据不同的平 ...