C# base和this的区别

①• base常用于,在派生类对象初始化时和基类进行通信。

②• base可以访问基类的公有成员和受保护成员,私有成员是不可访问的。

③• this指代类对象本身,用于访问本类的所有常量、字段、属性和方法成员,而且不管访问元素是任何访问级别。因为,this仅仅局限于对象内部,对象外部是无法看到的,这就是this的基本思想。另外,静态成员不是对象的一部分,因此不能在静态方法中引用this。

④• 在多层继承中,base可以指向的父类的方法有两种情况:一是有重载存在的情况下,base将指向直接继承的父类成员的方法,例如Audi类中的ShowResult方法中,使用base访问的将是Car.ShowResult()方法,而不能访问Vehicle.ShowResult()方法;而是没有重载存在的情况下,base可以指向任何上级父类的公有或者受保护方法,例如Audi类中,可以使用base访问基类Vehicle.Run()方法。这些我们可以使用ILDasm.exe,从IL代码中得到答案。【base访问的是直接的上级父类,但是执行顺序是从object的基类开始执行的】

4. 通用规则

  ①• 尽量少用或者不用base和this。除了决议子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this的使用容易引起不必要的结果。

  ②• 在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。

  ③• base是为了实现多态而设计的。

  ④• 使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。

  ⑤• 简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。

  ⑥• 除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方

具体详细解释见:http://www.cnblogs.com/reommmm/archive/2009/03/23/1419573.html


### 关于 `this` `base` 的用法 #### 使用 `this` 关键字 在 C# 中,`this` 是个关键字,用于引用当前实例或隐藏字段的参数。它通常有以下几个用途: 1. **作为方法参数传递当前对象** 当需要将当前类的对象作为个整体传递给其他方法时,可以使用 `this` 来表示当前对象[^4]。 ```csharp public class Person { public string Name { get; set; } public void Introduce() { Console.WriteLine($"Hi, my name is {Name}"); } public void Greet(Person other) { Console.WriteLine($"{this.Name} says hello to {other.Name}"); } } var personA = new Person { Name = "Alice" }; var personB = new Person { Name = "Bob" }; personA.Greet(personB); // Alice says hello to Bob ``` 2. **解决命名冲突 (Field Hiding)** 如果局部变量或参数名称与成员变量相同,则可以通过 `this` 明确指定成员变量[^5]。 ```csharp public class Rectangle { private int width; private int height; public Rectangle(int width, int height) { this.width = width; // 解决宽度属性的命名冲突 this.height = height; // 解决高度属性的命名冲突 } public int GetArea() => this.width * this.height; } ``` 3. **返回当前实例** 可以通过 `this` 返回当前实例本身,这常见于链式调用的设计模式中[^6]。 ```csharp public class StringBuilderExample { private string content = ""; public StringBuilderExample Append(string text) { this.content += text; return this; // 支持链式调用 } public override string ToString() => this.content; } var builder = new StringBuilderExample(); Console.WriteLine(builder.Append("Hello").Append(", ").Append("World!")); // Hello, World! ``` --- #### 使用 `base` 关键字 `base` 主要用于访问基类中的成员,在继承关系下非常有用。以下是其主要功能: 1. **显式调用基类构造函数** 子类可以在自己的构造函数中使用 `base` 调用父类的构造函数来初始化共享状态[^7]。 ```csharp public class Animal { protected string sound; public Animal(string s) { this.sound = s; } public virtual void MakeSound() { Console.WriteLine(sound); } } public class Dog : Animal { public Dog() : base("Woof") {} // 基类构造器被调用 } var dog = new Dog(); dog.MakeSound(); // 输出 Woof ``` 2. **覆盖并调用基类的方法实现** 在重写虚方法时,有时可能希望保留部分原有逻辑并通过 `base` 实现这点[^8]。 ```csharp public class Vehicle { public virtual void StartEngine() { Console.WriteLine("Starting engine..."); } } public class Car : Vehicle { public override void StartEngine() { base.StartEngine(); // 执行基类行为 Console.WriteLine("Car-specific startup logic"); } } var car = new Car(); car.StartEngine(); /* Output: Starting engine... Car-specific startup logic */ ``` 3. **访问受保护的基类成员** 即使子类无法直接看到某些私有的基类成员,也可以借助 `base` 访问它们(前提是这些成员声明为 `protected` 或更高可见性级别)[^9]。 ```csharp public class ParentClass { protected int value; public ParentClass(int v) { this.value = v; } public virtual void ShowValue() { Console.WriteLine(value); } } public class ChildClass : ParentClass { public ChildClass(int v) : base(v) {} public override void ShowValue() { Console.WriteLine(base.value + " from child"); // 使用 base 访问基类成员 } } var child = new ChildClass(42); child.ShowValue(); // 输出 42 from child ``` --- ### 总结 - `this` 用于操作当前实例及其成员。 - `base` 则专注于处理继承层次结构下的基类交互。 两者都提供了强大的工具集,帮助开发者更灵活地控制程序的行为数据流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值