C# this和base关键字的用法
this的用法
- this关键字在类中使用,代表当前类的实例对象,但是它只能被用于实例构造函数、实例方法、属性以及索引器中;
- 当局部变量名称与类中字段重名时,用来引用类的字段;
- 可以当做当前对象实例作为参数传递到其他方法中;
- 声明索引器;
- 在一个类中有多个构造函数,我们可以把一部分公共代码提取出来作为一个构造函数,被其余的构造函数作为构造函数初始化语句使用,可以用this串联构造函数;
1 class Car{ 2 private string name; 3 public void DoSmothing(string name){ 4 this.name=name;//类中字段与局部变量重名 5 CarTest.Test(this);//当做实例对象参数 6 } 7 public Car():this("Car"){} 8 public Car(string str):this(str,10){} 9 public Car(string str,int val){} 10 //声明Car car=new Car();会先调用Car(string,int),在调用Car(string),最后是Car(); 11 } 12 class CarTest{ 13 public static void Test(Car car){}; 14 }
- 为原始类型扩展方法;
- 扩展方法是一种特殊的静态方法,它必须定义在静态类中;
- 扩展方法的第一个参数以this修饰符为前缀,后面跟要扩展的目标模板类型以及其形参;
- 扩展方法所在类必须在使用它的类的可见范围,否则需要使用using指令引入命名空间;
- 扩展方法只能针对实例,因此目标类不能是静态类;
- 拓展方法与被扩展的类中某个方法签名相同,则该拓展方法无效,永远不会被调用;
- 同名情况下,其他命名空间的扩展方法的优先级低于当前命名空间的扩展方法,优先级最高的是实例方法;
1 static class Extends{ 2 //string类型扩展ToJson方法 3 public static object ToJson(this string Json){ 4 return Json == null ? null : JsonConvert.DeserializeObject(Json); 5 } 6 public static T ToObject<T>(this string Json){ 7 return Json == null ? default(T) : JsonConvert.DeserializeObject<T>(Json); 8 } 9 public static List<T> ToList<T>(this string Json){ 10 return Json == null ? null : JsonConvert.DeserializeObject<List<T>>(Json); 11 } 12 public static DataTable ToTable(this string Json){ 13 return Json == null ? null : JsonConvert.DeserializeObject<DataTable>(Json); 14 } 15 public static JObject ToJObject(this string Json){ 16 return Json == null ? JObject.Parse("{}") : JObject.Parse(Json.Replace(" ", "")); 17 } 18 }
base的用法
- 在派生类调用基类方法和字段等成员;
- 在派生类调用基类的构造方法;
1 class BaseClass{ 2 public string FieldA="基类"; 3 public void MethodA(){}; 4 public BaseClass(){} 5 public BaseClass(string str){} 6 } 7 class ChildClass:BaseClass{ 8 new public string FieldA="";//new 屏蔽基类成员 9 public ChildClass():base(){}//ChildClass child=new ChildClass();先调用基类无参构造函数,在调用派生类无参构造函数 10 public ChildClass(string str):base(str){}//ChildClass child=new ChildClass("name");先调用基类有参构造函数,在调用派生类有参构造函数 11 //如果没有base(str) 则是先调用默认的基类无参构造函数 12 public void Print(){ 13 Console.WriteLine(base.FieldA);//调用基类字段 14 base.MethodA();//调用基类方法 15 } 16 }