`
yzd
  • 浏览: 1809292 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

c#运算符

 
阅读更多
<div>
<a>C</a>和C++开发人员应很熟悉大多数C#运算符,这里为新程序员和VB开发人员介绍最重要的运算符,并介绍C#中的一些新变化。</div>
<div>C#支持表5-1所示的运算符,其中有4个运算符(sizeof、*、–&gt;、&amp;)只能用于不安全的代码(这些代码绕过了C#类型安全性的检查),这些不安全的代码见第7章的讨论。</div>
<div align="center" style="margin-top: 4.9pt;">表 5-1</div>
<div align="center">
<table cellspacing="0" cellpadding="0" border="1" style=""><tbody>
<tr>
<td width="256" valign="top" style="border-color: windowtext; border-width: 1pt; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="line-height: 13pt;">类 别</div>
            </td>
            <td width="327" valign="top" style="border-style: solid none; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="line-height: 13pt;">运算符</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">算术运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">+ – * / %</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">逻辑运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">&amp; | ^ ~ &amp;&amp; || !</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">字符串连接运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">+</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">增量和减量运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">++ – –</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">移位运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">&lt;&lt; &gt;&gt;</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">比较运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">== != &lt; &gt; &lt;= &gt;=</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">赋值运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">= += –= *= /= %= &amp;= |= ^= &lt;&lt;= &gt;&gt;=</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">成员访问运算符(用于对象和结构)</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">.</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">索引运算符(用于数组和索引器)</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">[]</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">数据类型转换运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">()</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">条件运算符 (三元运算符)</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">?:</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">委托连接和删除运算符(见第6章)</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">+ –</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">对象创建运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">new</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">类型信息运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">sizeof (只用于不安全的代码) is typeof as</div>
            </td>
        </tr>
</tbody></table>
</div>
<div align="right" style="margin-left: 0cm; line-height: 13pt;"></div>
<div align="center">
<table cellspacing="0" cellpadding="0" border="1" style=""><tbody>
<tr>
<td width="256" valign="top" style="border-color: windowtext; border-width: 1pt; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="line-height: 13pt;">类 别</div>
            </td>
            <td width="327" valign="top" style="border-style: solid none; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="line-height: 13pt;">运算符</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">溢出异常控制运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">checked unchecked</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">间接寻址运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">* –&gt; &amp; (只用于不安全代码) []</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">命名空间别名限定符(见第2章)</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">::</div>
            </td>
        </tr>
<tr>
<td width="256" valign="top" style="border-style: none solid solid none; padding: 1.4pt 9.9pt; width: 192.1pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">空接合运算符</div>
            </td>
            <td width="327" valign="top" style="border-style: none none solid; padding: 1.4pt 9.9pt; width: 244.9pt;">
            <div style="margin-left: 10.7pt; line-height: 13pt;">??</div>
            </td>
        </tr>
</tbody></table>
</div>
<div></div>
<div>使用C#运算符的一个最大缺点是,与C风格的语言一样,赋值(=)和比较(==)运算使用不同的运算符。例如,下述语句表示“x等于3”:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">x = 3;</div>
<div>如果要比较x和另一个值,就需要使用两个等号(==):</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">if (x == 3)</div>
<div>C#非常严格的类型安全规则防止出现常见的C#错误,也就是在逻辑语句中使用赋值运算符代替比较运算符。在C#中,下述语句会产生一个编译错误:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">if (x = 3)</div>
<div>习 惯使用宏字符&amp;来连接字符串的VB程序员必须改变这个习惯。在C#中,使用加号+连接字符串,而&amp;表示两个不同整数值的按位AND运算。 | 则在两个整数之间执行按位OR运算。VB程序员可能还没有使用过%(取模)运算符,它返回除运算的余数,例如,如果x等于7,则x% 5会返回2。</div>
<div>在C#中很少会用到指针,因此也很少会用到间接寻址运算符(–&gt;)。使用它们的惟一场合是在不安全的代码块中,因为只有在此C#才允许使用指针。指针和不安全的代码见第7章。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.1运算符的简化操作</font></strong></div>
<div>
<a>表5-2</a>列出了C#中的全部简化赋值运算符。</div>
<div style="margin-top: 8.15pt;">表 5-2</div>
<table width="586" cellspacing="0" cellpadding="0" border="1" style="border-style: none; margin-left: 9.9pt; width: 439.55pt; border-collapse: collapse;"><tbody>
<tr>
<td width="178" valign="top" style="border-color: windowtext; border-width: 1pt; padding: 0cm 9.9pt; width: 133.7pt;">
            <div>运算符的简化操作</div>
            </td>
            <td width="408" valign="top" style="border-style: solid none; padding: 0cm 9.9pt; width: 305.85pt;">
            <div>等价于</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x++, ++x</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x + 1</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x– –,– –x</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x – 1</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x+= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x + y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x–= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x – y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x *= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x * y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x /= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x / y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x %= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x % y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x &gt;&gt;= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x &gt;&gt; y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x &lt;&lt;= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x &lt;&lt; y</div>
            </td>
        </tr>
</tbody></table>
<table width="586" cellspacing="0" cellpadding="0" border="1" style="border-style: none; margin-left: 9.9pt; width: 439.55pt; border-collapse: collapse;"><tbody>
<tr>
<td width="178" valign="top" style="border-color: windowtext; border-width: 1pt; padding: 0cm 9.9pt; width: 133.7pt;">
            <div>运算符的简化操作</div>
            </td>
            <td width="408" valign="top" style="border-style: solid none; padding: 0cm 9.9pt; width: 305.85pt;">
            <div>等价于</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x &amp;= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x &amp; y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x |= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x | y</div>
            </td>
        </tr>
<tr>
<td width="178" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 133.7pt;">
            <div style="margin-left: 10.7pt;">x ^= y</div>
            </td>
            <td width="408" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 305.85pt;">
            <div style="margin-left: 10.7pt;">x = x ^ y</div>
            </td>
        </tr>
</tbody></table>
<div></div>
<div>为什么用两个例子来说明++增量和– –减量运算符?把运算符放在表达式的前面称为前置,把运算符放在表达式的后面称为后置。它们的执行方式有所不同。</div>
<div>增 量或减量运算符可以作用于整个表达式,也可以作用于表达式的内部。当x++和++x单独占一行时,它们的作用是相同的,对应于语句x = x + 1。但当它们用于表达式内部时,把运算符放在前面(++x)会在计算表达式之前递增x,换言之,递增了x后,在表达式中使用新值进行计算。而把运算符放在 后面(x++)会在计算表达式之后递增x<span style="">——</span>使用原来的值计算表达式。下面的例子使用++增量运算符说明了它们的区别:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int x = 5;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">if (++x == 6)</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">{</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> Console.WriteLine("This will execute");</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">}</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">if (x++ == 7)</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">{</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> Console.WriteLine("This won't");</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">}</div>
<div>第一个if条件得到true,因为在计算表达式之前,x从5递增为6。第二个if语句中的条件为false,因为在计算完整个表达式(x=6)后,x才递增为7。</div>
<div>前置运算符<span style="">––</span>x和后置运算符x<span style="">––</span>与此类似,但它们是递减,而不是递增。</div>
<div>其他简化运算符,如+= 和–=需要两个操作数,用于执行算术、逻辑和按位运算,改变第一个操作数的值。例如,下面两行代码是等价的:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">x += 5;</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">x = x + 5;</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.2三元运算符</font></strong></div>
<div>
<a>三元运算符(?:)</a>是if...else结构的简化形式。其名称的出处是它带有三个操作数。它可以计算一个条件,如果条件为真,就返回一个值;如果条件为假,则返回另一个值。其语法如下:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">
<em>condition</em> ? <em>true_value</em> :<em> false_value</em>
</div>
<div>其中condition是要计算的Boolean型表达式,true_value是condition为true时返回的值,false_value是condition为false时返回的值。</div>
<div>恰当地使用三元运算符,可以使程序非常简洁。它特别适合于给被调用的函数提供两个参数中的一个。使用它可以把Boolean值转换为字符串值true或false。它也很适合于显示正确的单数形式或复数形式,例如:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int x = 1;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">string s = x.ToString() + " ";</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">s += (x == 1 ? "man" : "men");</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">Console.WriteLine(s);</div>
<div>如果x等于1,这段代码就显示 man,如果x等于其他数,就显示其正确的复数形式。但要注意,如果结果需要用在不同的语言中,就必须编写更复杂的例程,以考虑到不同语言的不同语法。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.3 checked和unchecked运算符</font></strong></div>
<div><a>考虑下面的代码:</a></div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">byte b = 255;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">b++;</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">Console.WriteLine(b.ToString());</div>
<div>byte数据类型只能包含0~255的数,所以b值的增量会导致溢出。CLR如何处理这个溢出取决于许多方面,包括编译器选项,所以无论溢出有什么样的风险,都需要用某种方式确保得到我们希望的结果。</div>
<div>为此,C#提供了checked和 unchecked运算符。如果把一个代码块标记为checked,CLR就会执行溢出检查,如果发生溢出,就抛出异常。如果改变代码,使之包含checked运算符:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">byte b = 255;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">checked</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">{</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> b++;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">}</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">Console.WriteLine(b.ToString());</div>
<div>运行这段代码,就会得到一个错误信息:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow.</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;"> at Wrox.ProCSharp.Basics.OverflowTest.Main(String[] args)</div>
<div style="margin-top: 8.15pt; text-indent: 21.45pt;">注意:</div>
<div style="text-indent: 21.45pt;">用/checked编译器选项进行编译,就可以检查程序中所有未标记代码中的溢出。</div>
<div>如果要禁止溢出检查,可以把代码标记为unchecked:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">byte b = 255;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">unchecked</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">{</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> b++;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">}</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">Console.WriteLine(b.ToString());</div>
<div>在本例中,不会抛出异常,但会丢失数据<span style="">——因为</span>byte数据类型不能包含256,溢出的位会被丢掉,所以b变量得到的值是0。</div>
<div>注意,unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.4 is运算符</font></strong></div>
<div>
<a>is</a>运算符可以检查对象是否与特定的类型兼容。例如,要检查变量是否与object类型兼容:</div>
<div style="margin-top: 8.15pt; text-indent: 21.45pt;">注意:</div>
<div style="text-indent: 21.45pt;">“兼容”表示对象是该类型,或者派生于该类型。</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int i = 10;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">if (i is object)</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">{</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> Console.WriteLine("i is an object");</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">}</div>
<div>
<span style="">int</span><span style="">和从</span><span style="">object</span><span style="">继承而来的其他</span><span style="">C#</span><span style="">数据类型一样,表达式</span><span style="">i is object</span><span style="">将得到</span><span style="">true</span><span style="">,并显示信息。</span>
</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.5 as运算符</font></strong></div>
<div>as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。如下面的代码所示,如果object引用不指向string实例,把object引用转换为string就会返回null:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">object o1 = "Some String";</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">object o2 = 5;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"></div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">string s1 = o1 as string; //s1 = "Some String"</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">string s2 = o2 as string; //s1 = null</div>
<div>as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行 转换。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.6 sizeof运算符</font></strong></div>
<div>
<a>使用sizeof</a>运算符可以确定堆栈中值类型需要的长度(单位是字节):</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">unsafe</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">{</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> Console.WriteLine(sizeof(int));</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">}</div>
<div>其结果是显示数字4,因为int有4个字节。</div>
<div>注意,只能在不安全的代码中使用sizeof运算符。第7章将详细论述不安全的代码。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.7 typeof运算符</font></strong></div>
<div>typeof运算符返回一个表示特定类型的System.Type对象。例如,typeof(string)返回表示System.String类型的Type对象。在使用反射动态查找对象的信息时,这个运算符是很有效的。第11章将介绍反射。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.8可空类型和运算符</font></strong></div>
<div>如果在程序中使用可空类型,就必须考虑null值在与各种运算符一起使用时的影响。通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是null,其结果就是null。例如:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int? a = null;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"></div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">int? b = a + 4; // b = null</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int? c = a * 5; // c = null</div>
<div>但是在比较可空类型时,只要有一个操作数是null,比较的结果就是false。即不能因为一个条件是false,就认为该条件的对立面是true,这在使用非可空类型的程序中很常见。例如:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int? a = null;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">int? b = -5;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"></div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">if (a &gt;= b)</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> System.Console.WriteLine("a &gt;= b");</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">else</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"> System.Console.WriteLine("a &lt; b");</div>
<div style="margin-top: 8.15pt; text-indent: 21.45pt;">注意:</div>
<div style="text-indent: 21.45pt;">Null值的可能性表示,不能随意比较表达式中的可空类型和非可空类型,详见本章后面的内容。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.9空接合运算符</font></strong></div>
<div>空 接合运算符(??)为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类 型或引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数不是 null,则整个表达式就等于第一个操作数的值。但如果第一个操作数是null,则整个表达式就等于第二个操作数的值。例如:</div>
<div style="margin-top: 8.15pt; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">int? a = null;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">int b;</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;"></div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">b = a ?? 10; // b has the value 10</div>
<div style="margin-left: 21.45pt; text-indent: 18.45pt;">a = 3;</div>
<div style="margin-top: 0cm; margin-left: 21.45pt; text-indent: 18.45pt; margin-right: 0cm;">b = a ?? 10; // b has the value 3</div>
<div>如果第二个操作数不能隐含地转换为第一个操作数的类型,就生成一个编译错误。</div>
<div style="margin-top: 8.15pt; margin-left: 0cm; margin-right: 0cm;"><strong><font size="4">5.1.10运算符的优先级</font></strong></div>
<div>
<a>表5-3</a>显示了C#运算符的优先级。表顶部的运算符有最高的优先级(即在包含多个运算符的表达式中,最先计算该运算符):</div>
<div style="margin-top: 8.15pt;">表 5-3</div>
<div align="center">
<table cellspacing="0" cellpadding="0" border="1" style="border-style: none; border-collapse: collapse;"><tbody>
<tr>
<td width="146" valign="top" style="border-color: windowtext; border-width: 1pt; padding: 0cm 9.9pt; width: 109.75pt;">
            <div>组</div>
            </td>
            <td width="434" valign="top" style="border-style: solid none; padding: 0cm 9.9pt; width: 325.8pt;">
            <div>运算符</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">初级运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">() . [] x++ x<span style="">––</span> new typeof sizeof checked unchecked</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">一元运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">+ – ! ~ ++x <span style="">––</span>x和数据类型转换</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">乘/除运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">* / %</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">加/减运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">+ –</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">移位运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">&lt;&lt; &gt;&gt;</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">关系运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">&lt; &gt; &lt;= &gt;= is as</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">比较运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">= = !=</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">按位AND运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">&amp;</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">按位XOR运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">|</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">按位OR运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">^</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">布尔 AND运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">&amp;&amp;</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">布尔OR运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">||</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">三元运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">?:</div>
            </td>
        </tr>
<tr>
<td width="146" valign="top" style="border-style: none solid solid none; padding: 0cm 9.9pt; width: 109.75pt;">
            <div style="margin-left: 10.7pt;">赋值运算符</div>
            </td>
            <td width="434" valign="top" style="border-style: none none solid; padding: 0cm 9.9pt; width: 325.8pt;">
            <div style="margin-left: 10.7pt;">= += –= *= /= %= &amp;= |= ^= &lt;&lt;= &gt;&gt;= &gt;&gt;&gt;=</div>
            </td>
        </tr>
</tbody></table>
</div>
<div style="margin-top: 8.15pt; text-indent: 21.45pt;"><a>注意:</a></div>
在复杂的表达式中,应避免利用运算符优先级来生成正确的结果。使用括号指定运算符的执行顺序,可以使代码更整洁,避免出现潜在的冲突
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics