C#中,为什么在值类型后面加问号

在C#中,声明一个值类型或引用类型的变量,无论是否给这个变量赋初值,该变量都有默认值:

比如声明引用类型变量: string a,其等效于string a = null,string的默认值为null。
比如声明值类型变量:int a, 其等效于int a = 0,int的默认值为0。

为什么需要让值类型可以为null?

来看需要让值类型为null的场景:

在数据库中,通常值类型允许为null,比如int, decimal, DateTime类型允许为null,而如果C#中对应的值类型不能为null,在保存数据到数据库的时候就会造成数据类型的不一致。

又比如,在搜索的场景中,服务端声明一个变量,用来接收来自客户端的、某个字段的值,如果C#中不允许这个变量为null,但从客户端传来的字段值有可能为null(没有选择某个搜索条件),这样也造成了前后端数据类型的不一致。

为了应对这些场景,C#提供了允许让值类型为null的语法。

允许值类型为null的写法

DateTime? date = null; 等效于: Nullable<DateTime> date = null;
int? a = null; 等效于:Nullable<int> a = null;

如何避免因值类型为null而抛出异常?

通过if...else语句

int result;
if(a == null)
{
    result = 0;
}
else
{
    result = (int)a;
}

通过??

int result = a ?? 0;

C#中,为什么在值类型后面加问号

时间: 2024-10-10 08:29:44

C#中,为什么在值类型后面加问号的相关文章

Asp.net MVC 中Controller返回值类型ActionResult

内容转自 http://blog.csdn.net/pasic/article/details/7110134 Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必须是一个public方法 必须是实例方法 没有标志NonActionAttribute特性的(NoAction) 不能被重载 必须返回ActionResult类型 如: [csharp] view pl

可空值类型(类型后面加问号)

很多时候经常遇到类型后面加问号?如int? i=null,不知道标示什么,其实这是2.0的新语法:可控制类型. 由于一个值类型变量永远不可能为null,而数据库中的一个列是允许值为空的,为了与数据库中的列相对应,CLR引入了可空值类型. C#中是以问号表示法声明并初始化可空值类型的,如下代码所示: int? x=5; int? y=null; C#允许对可空值类型进行数据转换和转型,示例代码如下: int? x=5; int z =(int)x; 可以对可空值类型进行装箱.其规则是:若可空值类型

C#中引用类型和值类型的区别,分别有哪些

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 数组的元素,不管是引用类型还是值类型,都存储在托管堆上. 引用类型在栈中存储一个引用,其实际的存储位置位于托管堆.为了方便,本文简称引用类型部署在托管推上. 值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储:作为局部变量时,存储在栈上. 值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体:引

关于C#编程中引用与值类型赋值的一些容易犯错的地方

值类型与引用类型的区别在于:值类型在赋值的时候是拷贝值,引用类型在赋值的时候的拷贝引用.记住这一个原则,我们再来分析一些具体情况: 1 PointStruct pt1 = new PointStruct(2,2); 2 PointStruct pt2 = pt1; 3 PointStruct[] ptsArray = new PointStruct[3]; 4 ptsArray[0] = pt1; 5 ptsArray[1] = pt2; 6 List<PointStruct> ptsList

在JavaScript中引用类型和值类型的区别

一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量的数据存储方式,分配在堆内存,频繁创建对象有损性能. 引用类型(N多) Object.Array.Date.Function.-- 二.动态属性不一样 1.引用类型能动态添加属性 var person=new Object(); person.name="jack"; person.age

WWDC-UIKit 中协议与值类型编程实战

本文为 WWDC 2016 Session 419 的部分内容笔记.强烈推荐观看. 设计师来需求了 在我们的 App 中,通常需要自定义一些视图.例如下图: 我们可能会在很多地方用到右边为内容,左边有个装饰视图的样式,为了代码的通用性,我们在 UITableViewCell 的基础上,封装了一层 DecoratingLayout,然后再让子类继承它,从而实现这一类视图. class DecoratingLayout : UITableViewCell { var content: UIView

ASP.NET MVC中Controller返回值类型ActionResult

1.返回ViewResult视图结果,将视图呈现给网页 public class TestController : Controller { //必须存在Controller\Test\Index.cshtml文件 public ActionResult Index() { return View(); } } 2. 返回PartialViewResult部分视图结果,主要用于返回部分视图内容 //在View/Shared目录下创建ViewUserControl.cshtml部分视图 publi

解析类型后加问号和双问号

变量定义中类型后带一个问号,意思是这个数据类型是NullAble类型的.用于给变量设初值的时候,给变量(int类型)赋值为null,而不是0! 例子: int? i = 3 等同于Nullable<int> i = new Nullable<int>(3); int?是泛型Nullable<int>的另一种写法. 在定义方法的时候允许传null值: public void AddUser( string name, string password, int ? role

C#中的struct(结构)为值类型,struct类型全接触

众所周知,struct类型和class类型非常相似,尤其是在C++中,class可以办到的事struct几乎都可以实现.在C#中struc类型依然存在,它的用处相对来说已经显得越来越不重要,这里主要讲述一下C#中struct和class的一个最大不同点,在C#中struct是值类型,而class是引用类型. 例: class Program { struct Test { public int a ; } static void Main(string[] args) { Test test1