C#面向對象幾組關鍵字的詳解(this,base,dynamic,var,const,readonly,is,as)

  這幾個關鍵字,在用法上有許多類似之處。這裏主要看看細節之處的差別:安全

一.this和base的區別:

  • this(本類相關):只能在和對象相關的地方使用。this表示的是當前對象;new的是哪一個對象,這個this就表示的是哪一個對象
  • base(父類相關):表示調用父類的東西,或是父類構造方法
class Person
{
    static Person()
    {
        Console.WriteLine("Person靜態構造方法");
    }
    public Person()
    {
        Console.WriteLine("Person構造方法");
        Console.WriteLine(this);
    }
    public virtual void Show()
    {
        Console.WriteLine("Person方法");
    }
}
class Chinese : Person
{
    static Chinese()
    {
        Console.WriteLine("Chinese靜態構造方法");
    }
    public Chinese():base()   //調用父類構造方法
    {
        Console.WriteLine("Chinese構造方法");
        Console.WriteLine(this);
        base.Show();     //父類對象調用
        this.Show();       //本類對象調用
    }
    public override void Show()
    {
        Console.WriteLine("Chinese方法");
    }
}
例子分析

調用:ide

static void Main(string[] args)
{
    Person c = new Chinese();
    Console.ReadKey();
}

輸出信息:函數

  Chinese靜態構造方法
  Person靜態構造方法
  Person構造方法
  命名空間.Chinese
  Chinese構造方法
  命名空間.Chinese
  Person方法
  Chinese方法post

靜態構造方法與構造方法:this

    • 靜態構造方法:先調用本類的靜態構造方法,再調用父類
    • 構造方法:先調用父類構造方法,在調用本類的

二.var和dynamic的區別:

  • var(推斷類型):變量的類型是在編譯時決定的
  • dynamic:變量的類型是在運行時決定的
static void Main(string[] args)
{
    var name = 12;        //在編譯時,根據右邊的12就推測出左邊的name爲int
    name = "12";          //編譯時,這句就會異常,string不能賦值int
dynamic age = 12; //編譯的時候不會去管age是什麼類型,程序運行過程當中再解析 age = "12"; //這句會正常運行,程序運行解析爲string類型 Console.ReadKey(); }

通常可能在下列狀況使用dynamic:spa

    1. 動態語言對象
    2. 反射中動態建立對象

三.const和readonly的區別:

  • const:const的值是在編譯期間肯定的,所以只能在聲明時經過常量表達式指定其值
  • readonly是在運行時計算出其值的,因此還能夠經過靜態構造函數來賦值
class Person
{
    public Person() { }
    public const string s1 = "const";   //全部的s1都替換成了「const」
    public readonly string str = "";   //這裏的值能夠運算中計算得出
    public Person(string s)
    {
        str = s;
        //s1 = "ww";  //這裏s1就是一個常量了
    }
}
例子分析

調用:code

static void Main(string[] args)
{
    System.Console.WriteLine(Person.s1);
    Console.WriteLine(new Person().str);
    Person p1=new Person("11111");
    //p1.str="";         //只讀字段這裏是不能賦值的
    Console.WriteLine();
    Console.ReadKey();
}

四.is和as的區別:

  • is(判斷):is運算符用來檢查對象(變量)是否屬於某數據類型(如int、string、bool、double、class等),可在安全類型轉換以前進行判斷之用
  • as(轉換):as運算符用於執行引用類型的顯式類型轉換。若是要轉換的類型與指定的類型兼容,轉換就會成功進行;若是類型不兼容,as運算符就會返回值null

is表示對象是該類型,或者派生該類型:對象

static void Main(string[] args)
{
    string str = "string";
    int i = 21;
    Console.WriteLine(i is object);   //true
    Console.WriteLine(i is int);      //true
    Console.WriteLine(i is string);   //false

    Console.WriteLine(str is object);  //true
    Console.WriteLine(str is int);     //false
    Console.WriteLine(str is string);  //true
    Console.ReadKey();
}

as只能轉換引用類型,轉換失敗則返回nullblog

static void Main(string[] args)
{
    object obj = "string";
    object o = 5;
    string str = obj as string;   //string
    string str2 = o as string;    //null
    Console.ReadKey();
}
相關文章
相關標籤/搜索