这几个关键字,在用法上有许多类似之处。这里主要看看细节之处的差别:安全
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(); }