不卖关子,直接开门见山:

C#中两个问号的作用是判断??左边的对象是否为null,如果不为null则使用??左边的对象,如果为null则使用??右边的对象。

比如:a = b ?? c,如果b为null,则a = c,如果b不为null,则a = b。

下面一段代码演示了这两种情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Main(string[] args)
{
    NewFuck();
    Shit();
    Console.ReadKey();
}
 
private static void NewFuck()
{
    string fuck = "Fuck";
    Console.WriteLine(fuck ?? "fuck not found.");
}
 
private static void Shit()
{
    object shit = null;
    string b = (string)shit ?? "shit not found.";
    Console.WriteLine(b);
}

很明显,这种类似三目表达式的运算符可以用来在妹子面前装B,看个直观的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//文艺Fuck
private static void NewFuck()
{
    string fuck = "Fuck";
    Console.WriteLine(fuck ?? "fuck not found.");
}
 
//普通Fuck
private static void Fuck()
{
    string fuck = "Fuck";
    string s = fuck != null ? fuck : "fuck not found.";
    Console.WriteLine(s);
}    
 
//2BFuck
private static void SBFuck()
{
    string fuck;
    fuck = "Fuck";
    string s;
    if (fuck != null)
    {
        s = fuck;
    }
    else
    {
        s = "fuck not found.";
    }
    Console.WriteLine(s);
}

这三个方法在结果上是相同的,都会在屏幕上输出Fuck。当然,写个例子只是Demo级别的,我们在实际编程的时候用??运算符往往更有用,可以省去很多麻烦。比如处理页面QueryString的时候:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 原先要这样处理参数:
string tmd = String.Empty;
if (Request["Select"] != null)
{
    tmd = Request["Select"];
}
else
{
    tmd = "All";
}
 
// 现在重构为:
string tmd1 = Request["Select"] ?? "All";

怎么样?有没有觉得屌爆了。Session什么的也可以这么处理。顺便提一句,实际项目中处理参数比这个要复杂。往往包括类型转换等操作。类型转换建议用as操作符,强转不好。

 
 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int? a;

a = null;//此时输出3

//a = 6;//此时输出6

int b = a ?? 3;

Console.Write(b);

Console.ReadKey();

}

}

}

变量定义中含有一个问号,意思是这个数据类型是NullAble类型的。

变量定义中含有两个问号,双目运算符,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。

C#中一个问号和两个问号(a ?? b)的作用的更多相关文章

  1. C# 在Visual Studio中一个项目有两个Main函数, 怎么设置哪个是入口?取代csc /main选项。

    namespace ConsoleApp1{class Program{static void Main(string[] args){Console.WriteLine("Program& ...

  2. javaWeb中一个按钮提交两个表单

    一个按钮提交两个表单,有时候会用到,一般会很容易想到使用 onclick="document.form1.submit();document.form2.submit();" 的方 ...

  3. CSS中一个冒号和两个冒号有什么区别

    一个冒号是伪类,两个冒号是伪元素 伪类可以独立于文档的元素来分配样式,且可以分配给任何元素,逻辑上和功能上类类似,但是其是预定义的.不存在于文档树中且表达方式也不同,所以叫伪类.伪元素所控制的内容和一 ...

  4. tp 中一个字段写两个表达式的写法

    $maps['deadline'] = array(array('gt',0),array('elt',$endTime), 'and');

  5. (转)C#中两个问号和一个问号 ??

    小问题难倒很多人.今天发现了这个问题,搜了很长时间才看到记录下. 实例:dt.Columns.Add(firstRow.GetCell(i).StringCellValue ?? string.For ...

  6. C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?

    (1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功 ...

  7. C#语法中一个问号(?)和两个问号(??)的运算符

    (1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功 ...

  8. php两个问号??表示什么意思,PHP两个问号运算符,双问号表达式

    有同学给子恒老师留言, 说在php源代码中看到有两个问号?? 不知道是什么意思. 其实两个问题??是php7新推出的表达式, c = a ?? b; 表示如果a非空,则c = a, 如果a为空,则 c ...

  9. C# ??(两个问号)的表达式使用详解

    今天有人问我C#中两个问号是什么意思,怎么使用,于是乎有了这篇随笔 有时候我们需要判断某个对象是否为null,一般的做法是 if(x=null){....} 若想让自己的代码更简洁,可以这样写: st ...

随机推荐

  1. jQuery中设置form表单中action值的方法

    jQuery中设置form表单中action值的方法 (2011-03-17 10:18:19) 转载▼ 标签: 杂谈   html代码: <form id="myFormId&quo ...

  2. Tsinghua dsa pa2

    第一题,列车调度(train) 在这个题目中,模拟压栈出栈,同时判断调度方案是否可行. #include <cstdio> #include <cstring> #define ...

  3. ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

    1.启动报错SQL> startupORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instanceORAC ...

  4. linux下可以和qq截屏比拟的工具hotshots

    可以区域截图,并且对其进行编辑. 安装过程如下: sudo add-apt-repository ppa:ubuntuhandbook1/apps sudo apt-get update sudo a ...

  5. IE6、7下获得offset值跟其他浏览器不一样问题

    大家都知道,offset是元素的位置坐标,那位置坐标又和文档流有关系.如果position默认不设置的话,其值是static.static是个什么东东呢?下面我详细介绍一下: 语法: position ...

  6. 用JS做图片轮播

    脚本之家 首页应用手游攻略教程 ﹤首页 >> 网络编程 >> JavaScript >> 网页特效 >> 图象特效 js 图片轮播(5张图片) 作者:m ...

  7. 关于oracle卸载没有卸载完全的问题

    1.关闭oracle所有的服务.可以在windows的服务管理器中关闭: 2.打开注册表:regedit 打开路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS ...

  8. 2013ACM-ICPC亚洲区南京站现场赛G题

    题目大意:一个n维的系统中随机选一个向量(X1,X2,X3,...,Xn),其中0<=Xi<=R,且X1^2+X2^2+X3^2+……+Xn^2 <= R^2. 现在给定n,R.求X ...

  9. Android 分享微信好友 朋友圈

    第三方应用,可以调用微信分享,把链接,文字,各种media,分享到微信好友或者微信朋友圈,步骤: package com.edaixi.utils; import android.content.Co ...

  10. make file 详

    一: linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a ...