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中可以定义以下一 ...
随机推荐
- HuffmanTree
/* 例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下: 1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入, ...
- 分布式事务TransactionScope所导致几个坑
记录一下,个人见解,欢迎指正 错误: 1.该伙伴事务管理器已经禁止了它对远程/网络事务的支持. (异常来自 HRESULT:0x8004D025)2.事务已被隐式或显式提交,或已终止3.此操作对该事务 ...
- SPP NET (Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)
1. https://www.cnblogs.com/gongxijun/p/7172134.html (SPP 原理) 2.https://www.cnblogs.com/chaofn/p/9305 ...
- ConcurrentLinkedQueue 源码解读
一.介绍 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部:当我们获取一个元素时,它 ...
- Mybatis基于注解实现多表查询
对应的四种数据库表关系中存在四种关系:一对多,多对应,一对一,多对多.在前文中已经实现了xml配置方式实现表关系的查询,本文记录一下Mybatis怎么通过注解实现多表的查询,算是一个知识的补充. 同样 ...
- C++string,char* 字符数组,int类型之间的转换
string.int 常见类型之间相互转换 int & string 之间的转换 C++中更多的是使用流对象来实现类型转换 针对流对象 sstream实现 int,float 类型都可以实现 ...
- HDU-3549Flow Problem 最大流模板题
传送门 这里是Ford-Fulkerson写的最大流模板 #include <iostream> #include <cstdio> #include <algorith ...
- ACM-ICPC 2018 徐州赛区(网络赛)
目录 A. Hard to prepare B.BE, GE or NE F.Features Track G.Trace H.Ryuji doesn't want to study I.Charac ...
- Java面试-动态规划与组合数
最近在刷力扣上的题目,刷到了65不同路径,当初上大学的时候,曾在hihocoder上刷到过这道题目,但是现在已经几乎全忘光了,大概的知识点是动态规划,如今就让我们一起来回顾一下. 从题目说起 题目原文 ...
- 在Word指定位置插入富文本域值(html文本)
遇到此问题,首先想到的就是各种百度.结果度娘了一会并没有发现有用的有效的解决方法,哎,看来还得靠自己啊. 首先整理了下手头上的资源,一是HtmlAgilityPack,专门解析Html文本用的:二是我 ...