前言

   本节主要来讲C#中的各种运算符。主要包括is运算符、as运算符、checked和unchecked运算符、sizeof运算符、空接合运算符(??)、&和&&、移位运算符、增量和减量运算符、条件运算符(三元运算符)、命名空间别名限定符。

正文

 1、is运算符

is运算符可以检查对象是否与特定的类型兼容。比如下例中要检查变量是否与object类型兼容:

int i=;
if(i is object)
{
Console.WriteLine("i is an object.");
}

2、as运算符

as运算符用于执行引用类型的显式类型转换。如果要转换的类型和指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。举例如下:

        static void Main(string[] args)
{
object obj1 = "a string";
object obj2 = ;
string str1 = obj1 as string;
string str2 = obj2 as string;
Console.Write("str1为{0}\r\n", str1);
Console.Write("str2为{0}", str2);
Console.ReadLine();
}

注:as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。

3、checked和unchecked运算符

        static void Main(string[] args)
{
byte b = ;
b++;
Console.WriteLine("第一个"+b.ToString()); try
{
byte c = ;
checked
{
c++; //抛出OverflowException
Console.WriteLine(b.ToString());
}
}
catch (Exception e)
{
Console.WriteLine("抛出异常");
}
Console.ReadLine();
}

byte数据类型只能包含0~255的数,所以b值的增量会溢出。CLR如何处理溢出?C#提供了checked和unchecked运算符。如果把一块代码段标志为checked,CLR就会执行溢出检查,如果发生异常,就抛出异常。

如果要禁止溢出检查,可以把代码标记为unchecked。

注:unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。

4、sizeof运算符

sizeof可以用来确定堆栈中值类型需要的长度(单位是字节):

5、空接合运算符(??)

  空接合运算符为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型不同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。但如果第一个操作数是null,则整个表达式就等于第二个操作数的值。例如:

int?a=null;
int b;
b=a??; // b的值为10;
a=;
b=a??;// b的值为15;

6、&和&&

  &:二元运算符 (&) 为整型和 bool 类型预定义了二进制 & 运算符。对于整型,& 计算操作数的按位“与”。对于 bool 操作数,& 计算操作数的逻辑“与”;也就是说,当且仅当两个操作数均为 true 时,其结果才为 true。

  &&:条件“与”运算符 (&&) 执行布尔操作数的逻辑“与”运算,但如有必要,只计算第二个操作数。它与二元运算符 (&)很像,不同的是,如果 x 为 false,则不计算 y(因为不论 y 为何值,与操作的结果都为 false)。这被称作为“短路”计算。

稍微提一下按位“与”

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1。

   5&7 即  0000 0101 & 0000 0111 = 0000 0101   因此,5&7的值得5。

7、移位运算符

  是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算。

左移 (<<)

将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
  左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。

x<<1= x*2 
  x<<2= x*4 
  x<<3= x*8 
  x<<4= x*16

同理, 右移即相反:

右移 (>>) 
  将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。

右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。

x>>1= x/2 
  x>>2= x/4 
  x>>3= x/8 
  x>>4=x/16

当声明重载C#移位运算符(这个在第一节中也有一个重载符《+》http://www.cnblogs.com/aehyok/p/3499822.html)时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是 int,如:

    class Program
{
static void Main(string[] args)
{
ShiftClass shift1 = new ShiftClass(, );
ShiftClass shift2 = shift1 << ;
ShiftClass shift3 = shift1 >> ; Console.WriteLine("{0} << 2 结果是:{1}", shift1.valA, shift2.valA);
Console.WriteLine("{0} << 2 结果是:{1}", shift1.valB, shift2.valB);
Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valA, shift3.valA);
Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valB, shift3.valB); Console.ReadLine();
} public class ShiftClass
{
public int valA;
public int valB; public ShiftClass(int valA, int valB)
{
this.valA = valA;
this.valB = valB;
} public static ShiftClass operator <<(ShiftClass shift, int count)
{
int a = shift.valA << count;
int b = shift.valB << count;
return new ShiftClass(a, b);
} public static ShiftClass operator >>(ShiftClass shift, int count)
{
int a = shift.valA >> count;
int b = shift.valB >> count;
return new ShiftClass(a, b);
} }
}

8、增量和减量运算符、条件运算符(三元运算符)

这个在第一节中也有提到过http://www.cnblogs.com/aehyok/p/3499822.html

9、命名空间别名限定符

假如你实现了下面的代码,想打印一下:

Console.WriteLine("Hello World");

接下来再看,我们使用命名空间来进行访问:

你会发现这两种方式都无法实现了。那么可以通过如下方式进行调用

        static void Main()
{
global::System.Console.WriteLine("Hello World");
}

global 是 C# 2.0
中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它。

就如上面的代码中写了一个类,名字叫 System。那么当你再在代码里写 System
的时候,编译器就不知道你是要指你写的 System 类还是系统的 System 命名空间,而 System
命名空间已经是根命名空间了,无法再通过完全限名来指定。在以前的 C# 版本中,这就是一个无法解决的问题。现在,可以通过global::System 来表示 System 根命名空间,而用你自己的 MyNamespace.System  
来表示自己的类。

接下来我们再看一个小例子:

using colAlias = System.Collections;
namespace System
{
class TestClass
{
static void Main()
{
// Searching the alias:
colAlias::Hashtable test = new colAlias::Hashtable(); // Add items to the table.
test.Add("A", "");
test.Add("B", "");
test.Add("C", ""); foreach (string name in test.Keys)
{
// Seaching the gloabal namespace:
global::System.Console.WriteLine(name + " " + test[name]);
}
}
}
}

C#基础知识系列四(运算符汇总)的更多相关文章

  1. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  2. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...

  3. Java基础知识常见面试题汇总第一篇

    [Java面试题系列]:Java基础知识常见面试题汇总 第一篇 文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 ​ 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后 ...

  4. C# 基础知识系列- 3 集合数组

    简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...

  5. C# 基础知识系列-13 常见类库(三)

    0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...

  6. 基础知识系列☞C#中→属性和字段的区别

    "好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...

  7. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

  8. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  9. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

随机推荐

  1. 两台SQL Server数据同步解决方案

    复制的概念 复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式.使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可 ...

  2. AC日记——热浪 codevs 1557 (最短路模板题)

    1557 热浪  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德克萨斯纯朴的民眾们这个夏 ...

  3. [cb]NGUI组件基类之 UIWidget

    UIWidget NGUI的UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel.这就是UIWidget所 ...

  4. IL查看委托

    查看委托的IL 通过IL来查看委托的原理, 委托示例代码 写一个委托的类如下 using System;   namespace MyCollection { //定义一个类,该类包含两个静态方法 c ...

  5. nvl函数

    NVL(E1, E2)的功能为:如果E1为NULL,则函数返回E2,否则返回E1本身. 但此函数有一定局限,所以就有了NVL2函数. NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函 ...

  6. throw跟throws关键字

    throws关键字 定义一个方法的时候可以使用throws关键字声明.使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理. throws关键字格式: public 返回值类 ...

  7. 一个简单的scrapy爬虫抓取豆瓣刘亦菲的图片地址

    一.第一步是创建一个scrapy项目 sh-3.2# scrapy startproject liuyifeiImage sh-3.2# chmod -R 777 liuyifeiImage/ 二.分 ...

  8. 类图和对象图教程-类(Class)、接口(Interface)、协作(collaboration)、依赖关系(Dependency)、泛化关系(Generalization)、关联关系(Association)以及实现关系(Realization)

    类图的概念 (转) 一.概述 类图(Class Diagram)是描述类.接口.协作以及它们之间关系的图,用来显示系统中各个类的静态结构.类图是定义其他图的基础,在类图基础上,可以使用状态图.协作图. ...

  9. openresty 前端开发进阶一之http后端

    做前端开发,大多数情况下,都需要跟后端打交道,而最常见的方式则是通过http请求,进行通信. 在openresty中,通过http跟后端整合通信的方式又很多种,各有各的好处,可以根据情况交叉使用 1. ...

  10. 变态跳台阶-一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    class Solution { public: int jumpFloorII(int number) { ) ; ) ; *jumpFloorII(number-); } };