C#基礎知識系列四(運算符彙總)

前言html

   本節主要來說C#中的各類運算符。主要包括is運算符、as運算符、checked和unchecked運算符、sizeof運算符、空接合運算符(??)、&和&&、移位運算符、增量和減量運算符、條件運算符(三元運算符)、命名空間別名限定符。安全

正文測試

 一、is運算符this

is運算符能夠檢查對象是否與特定的類型兼容。好比下例中要檢查變量是否與object類型兼容:spa

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

 

二、as運算符code

as運算符用於執行引用類型的顯式類型轉換。若是要轉換的類型和指定的類型兼容,轉換就會成功進行;若是類型不兼容,as運算符就會返回值null。舉例以下:htm

        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運算符測試類型,再執行轉換。對象

 

三、checked和unchecked運算符blog

        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就會執行溢出檢查,若是發生異常,就拋出異常。get

若是要禁止溢出檢查,能夠把代碼標記爲unchecked。

注:unchecked是默認值。只有在須要把幾個未檢查的代碼行放在一個明確標記爲checked的大代碼塊中,才須要顯式使用unchecked關鍵字。

 

四、sizeof運算符

sizeof能夠用來肯定堆棧中值類型須要的長度(單位是字節):

 

 

五、空接合運算符(??)

  空接合運算符爲處理可空類型和引用類型時表示Null值的可能性提供了一種快捷方式。這個運算符放在兩個操做數之間,第一個操做數必須是一個可空類型或引用類型,第二個操做數必須與第一個操做數的類型不一樣,或者能夠隱含地轉換爲第一個操做數的類型。空接合運算符的計算以下:若是第一個操做數不是null,則整個表達式就等於第一個操做數的值。但若是第一個操做數是null,則整個表達式就等於第二個操做數的值。例如:

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

六、&和&&

  &:二元運算符 (&) 爲整型和 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。

 

七、移位運算符

  是用<<(左移) 和 >>(右移) 運算符是用來執行移位運算。

  左移 (<<) 

  將第一個操做數向左移動第二個操做數指定的位數,空出的位置補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);
            }

        }
    }

 

八、增量和減量運算符、條件運算符(三元運算符)

這個在第一節中也有提到過http://www.cnblogs.com/aehyok/p/3499822.html

九、命名空間別名限定符

假如你實現了下面的代碼,想打印一下:

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]);
            }
        }
    }
}
相關文章
相關標籤/搜索