【转】C#中base关键字的几种用法:base()
转:https://blog.csdn.net/cplvfx/article/details/82982862
base其实最大的使用地方在面相对象开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。
2.1关于base调用基类构造函数
public class A { public A() { Console.WriteLine("Build A"); } } public class B : A { public B() : base() { Console.WriteLine("Build B"); } static void Main() { B b = new B(); Console.ReadLine(); } }
运行结果:
Build A
Build B
2.2关于base在派生类中调用基类的方法。
public class A { public virtual void Hello() { Console.WriteLine("Hello"); } } public class B : A { public override void Hello() { base.Hello();//调用基类的方法,显示Hello Console.WriteLine("World"); } }
运行结果:
Hello
World
下面是我自己改进了一下上面的例子:
public class A { public virtual void Hello() { Console.WriteLine("Hello"); } } public class B : A { public static void Main () { B b = new B(); b.Hello2(); b.Hello(); } public override void Hello() { base.Hello();//调用基类的方法,显示Hello Console.WriteLine("World"); } public void Hello2() { base.Hello();//调用基类的方法,显示Hello } }
运行结果:
Hello
Hello
World
关于Base:
base 关键字用于从派生类中访问基类的成员:
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。
1. 在派生类中调用基类方法。
public class BaseClass { protected string _className = "BaseClass"; public virtual void PrintName() { Console.WriteLine("Class Name: {0}", _className); } } class DerivedClass : BaseClass { public string _className = "DerivedClass"; public override void PrintName() { Console.Write("The BaseClass Name is {0}", base._className); //调用基类方法 base.PrintName(); Console.WriteLine("This DerivedClass is {0}", _className); } } class TestApp { public static void Main() { DerivedClass dc = new DerivedClass(); dc.PrintName(); } } }
运行结果:
The BaseClass Name is BaseClass
Class Name: BaseClass
This DerivedClass is DerivedClass
2.在派生类中调用基类构造函数
public class BaseClass { int num; public BaseClass() { Console.WriteLine("in BaseClass()"); } public BaseClass(int i) { num = i; Console.WriteLine("in BaseClass(int {0})", num); } } public class DerivedClass : BaseClass { // 该构造器调用 BaseClass.BaseClass() public DerivedClass() : base() { } // 该构造器调用 BaseClass.BaseClass(int i) public DerivedClass(int i) : base(i) { } static void Main() { DerivedClass dc = new DerivedClass(); DerivedClass dc1 = new DerivedClass(1); Console.ReadLine(); } }
运行结果:
in BaseClass()
in BaseClass(int 1)
注意:
从静态方法中使用 base 关键字是错误的。
base 主要用于面向对象开发的对态这方面,在示例2中有体现。
-----------------------------------------------------------------------------我是一条帅气的分割线-------------------------------------------------------------帅气--------------------------------------------------------------------------------------------------------------的--------------------------------分------------割--------------线--------------------------
关于this
this 关键字引用类的当前实例。
以下是 this 的常用用途:
限定被相似的名称隐藏的成员
将对象作为参数传递到其他方法
声明索引器
class Employee { private string _name; private int _age; private string[] _arr = new string[5]; public Employee(string name, int age) { // 使用this限定字段,name与age this._name = name; this._age = age; } public string Name { get { return this._name; } } public int Age { get { return this._age; } } // 打印雇员资料 public void PrintEmployee() { // 将Employee对象作为参数传递到DoPrint方法 Print.DoPrint(this); } // 声明索引器 public string this[int param] { get { return _arr[param]; } set { _arr[param] = value; } } } class Print { public static void DoPrint(Employee e) { Console.WriteLine("Name: {0}\nAge: {1}", e.Name, e.Age); } } class TestApp { static void Main() { Employee E = new Employee("Hunts", 21); E[0] = "Scott"; E[1] = "Leigh"; E[4] = "Kiwis"; E.PrintEmployee(); for (int i = 0; i < 5; i++) { Console.WriteLine("Friends Name: {0}", E[i]); } Console.ReadLine(); } }
运行结果:
Name: Hunts
Age: 21
Friends Name: Scott
Friends Name: Leigh
Friends Name:
Friends Name:
Friends Name: Kiwis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通