這幾個關鍵字,在用法上有許多類似之處。這裏主要看看細節之處的差別:安全
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
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
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表示對象是該類型,或者派生該類型:對象
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(); }