C# 操作符 ?? 和 ?:

原文链接:https://msdn.microsoft.com/zh-cn/library/ms173224(v=vs.80).aspx
如果 ?? 运算符的左操作数非空,该运算符将返回左操作数,否则返回右操作数。
备注
可空类型可以包含值,或者可以是未定义的。
?? 运算符定义:当可空类型分配给非可空类型时返回的默认值。如果在将可空类型分配给非可空类型时不使用 ?? 运算符,将生成编译时错误。如果使用强制转换,并且当前未定义可空类型,将发生 InvalidOperationException 异常。

// nullable_type_operator.cs
using System;
class MainClass
{
    static int? GetNullableInt()
    {
        return null;
    }

    static string GetStringValue()
    {
        return null;
    }

    static void Main()
    {
        // ?? operator example.
        int? x = null;

        // y = x, unless x is null, in which case y = -1.
        int y = x ?? -1;

        // Assign i to return value of method, unless
        // return value is null, in which case assign
        // default value of int to i.
        int i = GetNullableInt() ?? default(int);

        string s = GetStringValue();
        // ?? also works with reference types. 
        // Display contents of s, unless s is null, 
        // in which case display "Unspecified".
        Console.WriteLine(s ?? "Unspecified");
    }
}

原文链接:http://www.cnblogs.com/refactor/archive/2012/05/30/2526147.html

//第一段代码:
string strParam = Request.Params["param"];
if ( strParam== null )
{
    strParam= "";
}

//第二段代码:
string strParam=
  Request.Params["param"] == null ? "": Request.Params["param"];

尽管实现的同一个功能,但第二段代码要比第一段代码是不是更简洁
原文链接:https://baike.baidu.com/item/%E4%B8%89%E5%85%83%E8%BF%90%E7%AE%97%E7%AC%A6/1394210?fr=aladdin
三元运算符语法:
条件表达式?表达式1:表达式2
说明:问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2。

其逻辑为:“如果为条件成立或者满足则执行表达式1,否则执行第二个。”
常用在设置默认值。
例如:某个值不一定存在,则判断这个值是否存在,不存在给默认值(表达式2)。
?: 运算符可以用作 if…else 语句的快捷方式。
这里写图片描述


在使用条件操作符的时候要注意,假定条件表达式是这样 x?y:z,
表达式类型的只能是使y 和z的变量类型之一,换句话说就是 y和z的变量类型决定这个条件表达式的类型
无论y和z是同一类型,还是y和z不是同一类型。 如果表达式的类型和赋值类型不一致,发生编译时错误 ,例如:如果你想实现如下代码:

string strTemp ;
object obj;
if(strTemp ==  "")
{
    obj = DBNull.Value;
}
else
{
    obj = strTemp ;
}

//然后为了简单,改写成下面的这种形式:
string strTemp;
object obj = strTemp == ""?DBNull.Value:strTemp;
//你编译的时候,会报错。因为DBNull和string之间没隐式转换,修改成如下代码就可以了:
object obj = strTemp == ""? DBNull.Value: (object)strTemp;

另外条件操作符是向右关联的,从左到右进行计算,于是a?b:c?d:e 应理解为 a?b:(c?d:e)。


上面提到了DBNull,在c#2.0里面实现了Nullable数据类型,别小看这个数据类型,其实非常有用,
从此我们就可以放弃对object数据进行 if(object==null)这样的判断了。同时你会发现,
在数据库应用上,数据库中有的字段允许取空值,在C#世界中引入nullable类型正好与之对应
,从(C#)对象映射到关系数据库对象,或者反过来,转换都是比较平滑。


为了实现Nullable数据类型转换成non-Nullable型数据,就有了一个这样的操作符”??(两个问号)“,

双问号操作符意思是
1、取所赋值??左边的。
2、如果左边为null,取所赋值??右边的。


比如int y = x ?? -1 如果x为空,那么y的值为-1.
于是这时候就可以把最上面第二段代码改成:

string strParam= Request.Params["param"]?? "";

嘿嘿,是不是更简洁了。


另外还有”?(单问号)“修饰符,是System.Nullable的缩写形式,比如int?代表是可空的整形
例如:int? a = 1 或者 int? b=null。Nullable类型具有一个HasValue的bool类型只读属性,
当Nullable类型实例的该属性为true时,则表示该实例是非空实例,包含一个已知值Value,
HasValue为false时,访问Value属性将导致System.InvalidOperationException。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值