开发者社区> aehyok> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C#基础知识系列四(运算符汇总)

简介: 前言    本节主要来讲C#中的各种运算符。主要包括is运算符、as运算符、checked和unchecked运算符、sizeof运算符、空接合运算符(??)、&和&&、移位运算符、增量和减量运算符、条件运算符(三元运算符)、命名空间别名限定符。
+关注继续查看

前言

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

正文

 1、is运算符

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

int i=0;
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 = 5;
            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 = 255;
            b++;
            Console.WriteLine("第一个"+b.ToString());

            try
            {
                byte c = 255;
                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??10; // b的值为10;
a=15;
b=a??10;//  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(5, 10);
            ShiftClass shift2 = shift1 << 2;
            ShiftClass shift3 = shift1 >> 2;

            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", "1");
            test.Add("B", "2");
            test.Add("C", "3");

            foreach (string name in test.Keys)
            {
                // Seaching the gloabal namespace:
                global::System.Console.WriteLine(name + " " + test[name]);
            }
        }
    }
}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CSS——CSS基础知识
CSS——CSS基础知识
14 0
C/C++基础知识点汇总
C/C++基础知识点汇总
48 0
图的基础知识
图G(graph)由顶点集V(vertex)和边集E(edge)组成,记为G(V,E)
73 0
图的基础知识
图G(graph)由顶点集V(vertex)和边集E(edge)组成,记为G(V,E)
369 0
一些js基础知识收集
1、输出今天的日期以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26 2、为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,[if !supportLists]1.     [endif]请写一个函数escapeHtml,将, &, “进行转义 3、用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。
1011 0
C# 知识点汇总
C#编程基础加强/Windows编程基础 核心技术课程 编程基础强化练习、面向过程编程(变量、if、for、while、函数、类型转换、枚举、数组、重载、值类型、引用类型、ref、out、字符串)、面向对象编程(类、继承、接口、异常、索引器、多态)、 Attribute、常用数据结构(List、Dictionary、Array)、常用.net类库、泛型、IO流等。
1255 0
redis系列(2)基础知识
what id redis? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
874 0
C#基础知识—父类和子类的关系
基础知识一: using System; using System.Collections.Generic; using System.Linq; using System.Windows.
799 0
C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言   之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处。   本文的重点就是:值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做装箱,引用类型转为值类型叫拆箱。
951 0
+关注
aehyok
踏踏实实的做技术,信自己没有什么不可以。
278
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载