C#知识学习-020(访问关键字)

目录

1.base关键字

1.1举例

1.1.1调用基类中被重写的方法

1.1.2调用基类的构造函数

1.2注意事项

1.3总结

2.this关键字

2.1使用this的情况

2.1.1限定类似名称隐藏的成员

2.1.2将对象作为参数传递给其他方法

2.1.3声明索引器

2.2重要提醒

2.3简单理解


1.base关键字

base关键字用于在派生类中访问基类的成员。具体来说,它有两个主要用途:

  • 调用基类中被子类重写(override)的方法。
  • 在派生类的构造函数中调用基类的构造函数(指定调用哪个基类构造函数)。

1.1举例

1.1.1调用基类中被重写的方法

假设我们有一个基类 Person,它有一个方法 GetInfo,该方法被标记为 virtual,意味着它可以被派生类重写。

然后,我们有一个派生类 Employee,它重写了 GetInfo方法。但在重写的方法中,我们还想调用基类的 GetInfo方法,这时就可以使用 base.GetInfo()

复制代码
Employee E = new Employee();
E.GetInfo();

public class Person
{
    protected string ssn = "20251128";
    protected string name = "bo luo";

    public virtual void GetInfo()
    {
        Console.WriteLine($"Name: {name}");
        Console.WriteLine($"SSN: {ssn}");
    }
}

class Employee : Person
{
    public readonly string id = "ABCDEFG";

    public override void GetInfo()
    {
        // 调用基类的GetInfo方法
        base.GetInfo();
        // 然后输出派生类特有的信息
        Console.WriteLine($"Employee ID: {id}");
    }
}

输出:
Name: bo luo
SSN: 20251128
Employee ID: ABCDEFG

1.1.2调用基类的构造函数

在继承中,当我们创建派生类的实例时,会先调用基类的构造函数 ,然后再调用派生类的构造函数。如果我们想指定调用基类的哪个构造函数(因为基类可能有多个构造函数),就可以使用 base关键字。

复制代码
public class BaseClass
{
    private int num;

    public BaseClass()
    {
        Console.WriteLine("in BaseClass()");
    }

    public BaseClass(int i)
    {
        num = i;
        Console.WriteLine("in BaseClass(int i)");
    }

    public int GetNum()
    {
        return num;
    }
}

public class DerivedClass : BaseClass
{
    // 这个构造函数会调用基类的无参构造函数 BaseClass()
    public DerivedClass() : base()
    {
    }

    // 这个构造函数会调用基类的有参构造函数 BaseClass(int i)
    public DerivedClass(int i) : base(i)
    {
    }

    static void Main()
    {
        DerivedClass md = new DerivedClass();   // 调用基类的无参构造函数
        DerivedClass md1 = new DerivedClass(1); // 调用基类的有参构造函数
    }
}

输出:
in BaseClass()
in BaseClass(int i)

1.2注意事项

  • 使用 base关键字只能访问基类中非私有的成员(即 public、protected或 internal等可访问的成员)。

  • 在静态方法中不能使用 base关键字,因为静态方法不依赖于实例,而 base是针对实例的。

  • 当基类没有无参构造函数时必须使用 base,有无参构造函数时可以省略

    复制代码
    public class BaseClass
    {
        public string Name;
        
        // 只有有参构造函数,没有无参构造函数
        public BaseClass(string name)
        {
            Name= name;
        }
    }
    
    public class DerivedClass : BaseClass
    {
        public DerivedClass(string name) : base(name)  // 必须用base指定
        {
            // 如果不写 : base(name),会报错!
        }
    }

1.3总结

  • base.方法名()= "调用基类的这个方法"

  • : base(参数)= "创建派生类时,先这样创建基类"

base关键字在继承中非常有用,它允许我们重用基类的代码,并在其基础上进行扩展。通过 base,我们可以调用基类的方法和构造函数,从而避免重复代码,并确保基类的初始化逻辑得到执行。

2.this关键字

this关键字主要用途:

  • 引用当前类的实例(在实例方法或构造函数中)。

2.1使用this的情况

2.1.1限定类似名称隐藏的成员

当方法的参数或局部变量与类的字段(成员变量)同名 时,使用this 可以明确指定要访问的是类的字段,而不是参数或局部变量。

例如,在Cat类的构造函数中,参数name和age与类的字段name和age同名。为了区分,使用this.name表示当前对象的name字段,而name表示参数。

复制代码
public class Cat
{
    private string name;   // 字段
    private string age;  // 字段

    // 构造函数,参数与字段同名
    public Cat(string name, string age)
    {
        // 使用this来区分字段和参数
        this.name = name;   // 将参数name赋值给当前对象的name字段
        this.age= age; // 将参数age赋值给当前对象的age字段
    }
}

如果不使用this,在构造函数中写name = name,那么实际上只是参数自己赋值给自己,字段的值并没有被修改。使用this可以明确指定左边的name是当前对象的字段。

2.1.2将对象作为参数传递给其他方法

在类的方法中,可以使用this将当前对象传递给另一个方法。

例如,在下面的例子中
this ​ 代表当前正在执行方法的那个Cat对象(即cat变量指向的对象)
传递this ​ 就是把整个猫咪对象传给RegistrationSystem使用
RegistrationSystem接收到的是完整的对象引用,可以访问对象的所有属性和方法

复制代码
Cat cat= new Cat("冻干", "纯净水");
cat.PrintAccountInfo();

public class Cat
{
    public string food { get; set; }
    public string water { get; set; }

    public Cat(string foodNumber, string waterNumber)
    {
        food = foodNumber;
        water = waterNumber;
    }

    // 打印小猫食物信息的方法
    public void PrintAccountInfo()
    {
        Console.WriteLine($"食物: {food}, 水: {water}");

        // 把当前对象传给登记系统进行记录
        RegistrationSystem.RecordTransaction(this);// 传递整个猫咪对象
    }
}

// 登记系统类
public static class RegistrationSystem
{
    public static void RecordTransaction(Cat cat)
    {
        Console.WriteLine($"[查询记录] 食物: {cat.food} ,水: {cat.water}");
    }
}

2.1.3声明索引器

**索引器允许对象像数组一样被索引。**在声明索引器时,使用this关键字来定义索引器。

例如,我们有一个类,内部封装了一个数组,this[int index]定义了一个索引器,它允许我们使用数组语法来访问MyCollection对象的元素。

复制代码
MyCollection coll = new MyCollection();
coll[0] = 1;   // 调用索引器的set访问器
Console.WriteLine(coll[0]); // 调用索引器的get访问器,输出1
public class MyCollection
{
    private int[] array = new int[100];

    // 索引器
    public int this[int index]
    {
        get
        {
            return array[index];
        }
        set
        {
            array[index] = value;
        }
    }
}

2.2重要提醒

  • 静态方法中不能用 this(因为静态方法不属于具体对象)

  • 大部分情况下,this可以省略,但当名字冲突时必须使用

2.3简单理解

this想象成"我"或"这个"。在代码中,它总是指"当前正在执行方法的那个对象"。

学到了这里,咱俩真棒,记得按时吃饭(最近好困,每天就是喝着美式,说没事!)

【本篇结束,新的知识会不定时补充】

感谢你的阅读!如果内容有帮助,欢迎 ​​点赞❤️ + 收藏⭐ + 关注​​ 支持! 😊

相关推荐
●VON1 小时前
Electron 项目在“鸿蒙端”与“桌面端”运行的区别
javascript·学习·electron·openharmony
箫笙默1 小时前
JS基础 - 正则笔记
开发语言·javascript·笔记
لا معنى له1 小时前
残差网络论文学习笔记:Deep Residual Learning for Image Recognition全文翻译
网络·人工智能·笔记·深度学习·学习·机器学习
xxp43212 小时前
Qt 网络编程 TCP通信
开发语言·qt
T***u3332 小时前
PHP在电商中的会员管理
开发语言·wireshark·php·ue4·jina
张丶大帅2 小时前
JS案例合集
开发语言·javascript·笔记
b***66612 小时前
【golang学习之旅】使用VScode安装配置Go开发环境
vscode·学习·golang
gc_22993 小时前
学习C#调用AspNetCoreRateLimit包限制客户端访问次数(2:配置说明)
c#·配置说明·ratelimit