C#中 ??、 ?、 ?: 、?.、?[ ] 问号
<h3>1. 可空类型修饰符(?)</h3><p>引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。<br>例如:string str=null; 是正确的,int i=null; 编译器就会报错。<br>为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?”<br>例如:int? 表示可空的整形,DateTime? 表示可为空的时间。<br>T? 其实是System.Nullable(泛型结构)的缩写形式,<br>也就意味着当你用到T?时编译器编译时会把T?编译成System.Nullable的形式。<br>例如:int?,编译后便是System.Nullable的形式。</p>
<h3>2. 三元(运算符)表达式(?: )</h3>
<p>例如:x?y:z 表示如果表达式x为true,则返回y;<br>如果x为false,则返回z,是省略if{}else{}的简单形式。</p>
<h3>3. 空合并运算符(??)</h3>
<p>用于定义可空类型和引用类型的默认值。<br>如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。<br>例如:a??b 当a为null时则返回b,a不为null时则返回a本身。<br>空合并运算符为右结合运算符,即操作时从右向左进行组合的。<br>如,“a??b??c”的形式按“a??(b??c)”计算。</p>
<h3>4.NULL检查运算符(?.) </h3>
<p>例如我们要获取一个Point序列的第一个点的X坐标,第一感觉会这么写:<br>int firstX = points.First().X;<br>但是,老鸟会告诉你,这儿没有进行NULL检查,正确的版本是这样的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">int</span>? firstX = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (points != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> first =<span style="color: rgba(0, 0, 0, 1)"> points.FirstOrDefault();
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (first != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
firstX </span>=<span style="color: rgba(0, 0, 0, 1)"> first.X;
}</span></pre>
</div>
<p>正确倒是正确了,代码取变得难读多了。在C# 6.0中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:</p>
<p>int? firstX = points?.FirstOrDefault()?.X;<br><br>从这个例子中我们也可以看出它的基本用法:如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL</p>
<p>需要注意的是,由于"?.“运算符返回的可以是NULL,当返回的成员类型是struct类型的时候,”?.“和”."运算符的返回值类型是不一样的。<br> </p>
<div class="cnblogs_code">
<pre> Point p = <span style="color: rgba(0, 0, 255, 1)">new</span> Point(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(p.X.GetType() </span>== <span style="color: rgba(0, 0, 255, 1)">typeof</span>(<span style="color: rgba(0, 0, 255, 1)">int</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
Console.WriteLine(p?.X.GetType() == <span style="color: rgba(0, 0, 255, 1)">typeof</span>(<span style="color: rgba(0, 0, 255, 1)">int</span>?)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span></pre>
</div>
<h3>5"?[]"运算符:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">int</span>? first = customers?[<span style="color: rgba(128, 0, 128, 1)">0</span>].Orders.Count();</pre>
</div>
<p>(这个不太清楚,感觉微软语法糖用过头了。)</p>
<p>本质:都使用了语法糖,在编译阶段编译器会把特殊符号先转译成原始状态再编译。</p>
<p> </p>
<p>业余时间写的小程序,可以帮忙看看挂了没,谢谢。</p>
<p><img src="https://img2024.cnblogs.com/blog/785339/202601/785339-20260126094744472-1209857227.jpg" alt="gh_f6f484e6c130_344 (2)" loading="lazy"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><br>原文链接:https://blog.csdn.net/qq_42453390/article/details/90403344</p><br><br>
来源:https://www.cnblogs.com/youmingkuang/p/11459615.html
頁:
[1]