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想象成"我"或"这个"。在代码中,它总是指"当前正在执行方法的那个对象"。

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

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

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

<think> 首先,用户的问题是:“我想了解C#中partial关键字的相关信息 请问C# partial关键字的使用、作用和相关知识”。这是一个直接的查询,我需要基于提供的引用来回答。 系统指令回顾: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 提供的引用: - [^1]: 关于标识符和保留字的介绍,提到保留字有特殊含义。 - [^2]: 提到is、as、using关键字的使用。 - [^3]: 关于partial关键字的使用:允许将一个类的定义分散到多个文件中。 - [^4]: 详细解释了partial关键字的使用场景、注意事项。 - [^5]: 在Unity框架中的示例,展示partial关键字的应用。 用户的问题聚焦于partial关键字,所以我应该主要参考[^3]、[^4]、[^5]。 回答结构: - 由于系统要求"回答结构清晰,帮助用户逐步解决问题",我应该分步骤解释partial关键字- 包括:什么是partial关键字、为什么使用它(作用)、如何使用(使用)、注意事项(相关知识)、示例。 - 最后,生成相关问题。 关键点从引用: - [^3]: partial声明部分类,允许类定义在多个文件中。 - [^4]: - 使用场景:大型项目、多人协作;自动生成代码。 - 注意事项:所有部分必须有partial关键字;相同的可访问性;抽象或密封影响整个类;继承基类一致;接口合并使用;成员可互相使用;嵌套类可以是partial。 - [^5]: 在Unity中的具体代码示例,使用partial类来组织代码。 回答大纲: 1. **介绍partial关键字**:解释它是C#中的关键字,用于将类、结构或接口的定义分成多个部分。 2. **作用**:为什么要使用partial关键字?提高代码管理性、支持多人协作、方便代码生成(如Visual Studio自动生成的代码)。 3. **使用方式**:如何定义partial类?在每个文件中声明partial class。 4. **相关知识**:注意事项,如所有部分必须相同可访问性、继承规则等。 5. **示例**:简要描述一个示例,基于引用[^5]。 6. **引用标识**:在相关段落末尾添加引用。 7. **生成相关问题**:结束时生成相关问题。 数学表达式:用户问题关于C#关键字,没有数学内容,所以可能不需要LaTeX格式,但要遵循系统指令。如果没有数学,就省略LaTeX。 生成相关问题:根据指令"生成相关问题",在回答结束时添加类似于示例的"相关问题"部分。相关问题应基于partial关键字,如优化partial使用、替代方案、常见错误等。 完整回答结构: - 开头:直接回答用户问题。 - 主体:分点阐述。 - 结尾:总结或生成相关问题。 语言:中文。 最终输出: - 先回答。 - 然后相关问题。 </think> ### C# partial关键字的使用、作用和相关知识C#编程中,`partial`关键字允许你将一个类、结构或接口的定义分散到多个文件中。这提高了代码的可管理性和协作效率。以下是基于您的查询,我整理的详细解释(参考了相关引用资料)。 #### 1. **partial关键字的作用** - partial关键字的主要作用是**支持代码模块化**:它允许多个开发者或工具在一个项目中独立处理同一个类的不同部分,而无需修改同一个文件。这在大型项目中尤其有用,例如在GUI设计或自动生成代码时(如在Visual Studio中创建窗体时生成的代码会自动分割)[^3][^4]。 - **关键优势**: - 提高协作效率:多人可以同时在多个文件中编辑同一个类。 - 简化代码维护:自动生成的代码(如窗体属性)与用户编写的代码分离,避免冲突。 - 增强可读性:代码逻辑被分组到不同文件,便于理解和扩展。 #### 2. **partial关键字的使用方式** - **基本语法**:在每个文件中定义类时,添加`partial`关键字。编译器在编译时会自动将所有部分合并成一个完整的类定义。 - 示例代码(基于引用[^5]的Unity示例): ```csharp // 文件1: TransformSimplify.cs public partial class TransformSimplify { public static void AddChild(Transform transform, Transform childTrans) { childTrans.SetParent(transform); } } // 文件2: GameObjectSimplify.cs public partial class GameObjectSimplify { public static void Show(Transform transform) { transform.gameObject.SetActive(true); } public static void Hide(Transform transform) { transform.gameObject.SetActive(false); } } ``` 在这个例子中,`TransformSimplify`和`GameObjectSimplify`类被定义为`partial`,允许在不同文件中编写方法逻辑(如`AddChild`和`Hide`)。编译器会将它们合并为一个类[^5]。 - **适用场景**: - 大型项目:当类变得庞大时,分割成多个文件便于分工。 - 代码生成工具:Visual Studio在创建Windows窗体或Web窗体时,自动生成属性代码文件(如`Form.Designer.cs`),用户则在另一个文件编写业务逻辑。 - 扩展功能:可以轻松添加新功能而不影响现有代码(例如,在Unity框架中组织游戏对象操作)[^4][^5]。 #### 3. **partial关键字的相关知识和注意事项** - **规则和约束**: - **所有部分必须使用partial关键字**:每个文件的类声明中都必须包含`partial`修饰符,否则编译器会报错[^3][^4]。 - **访问修饰符必须一致**:所有部分必须有相同的可访问性(如全部为`public`或`private`)。 - **继承和接口**: - 如果任何部分指定了基类,则整个类继承该类(所有部分必须一致指定基类)。 - 不同部分可以声明不同的接口,最终类实现所有声明接口的合并。 - **抽象和密封性**:如果任意部分标记为`abstract`或`sealed`,整个类被视为抽象或密封。 - **成员共享**:所有部分中声明的成员(方法、属性)在整个类中共享,可以互相访问- **嵌套类支持**:嵌套类也可以使用`partial`,即使外部类不是partial(例如:`class Container { partial class Nested { ... } }`)[^4]。 - **常见错误和陷阱**: - 避免在不同部分定义重复成员:这会导致编译错误(如两个文件都定义了同名方法)。 - 命名空间一致:所有部分必须在同一个命名空间下。 - 性能影响:partial类不影响运行时性能,仅作用于编译时合并。 - **最佳实践**:推荐在需要分离自动代码和手动代码时使用(如UI设计器生成的代码),或在团队协作中明确划分职责。不适用于小型类,以免增加复杂度[^3][^4]。 总之,partial关键字C#中一个强大的模块化工具,特别适合提升大型项目的开发效率。使用时需遵守上述规则,以确保代码正确合并。如果您有具体代码场景,可以提供更多细节进行深入讨论!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值