7.2 C#的类全解(概念、声明、成员、修饰符、重载)


7.2.1 类的概念

类(Class)是面向对象编程(OOP)中的核心概念之一,它作为创建对象的模板或蓝图,定义了对象的属性(数据)和方法(行为)。以下是类的一些关键特性和组成:

类的关键特性

  1. 抽象:类是对现实世界中事物的抽象,它定义了事物的通用特征和行为。

  2. 封装:类将数据和操作这些数据的方法组合在一起,并隐藏内部的实现细节,只对外提供有限的接口。

  3. 继承:类可以通过继承机制复用代码,子类可以继承父类的属性和方法。

  4. 多态:类可以实现多态性,即同一个方法在不同的对象中可以有不同的实现。

类的组成

  1. 数据成员

    • 常量:在类中不会被修改的变量。
    • (Field):类中用于存储数据的变量。
  2. 函数成员

    • 方法(Method):类中定义的函数,用于执行类的行为。
    • 属性(Property):用于控制对类中字段的访问。
    • 事件(Event):用于处理对象间的通信。
    • 索引器(Indexer):允许对象被索引,就像数组一样。
    • 运算符(Operator):允许对类类型使用标准的C#运算符。
    • 构造函数:用于初始化新创建的对象。
      • 实例构造函数:初始化非静态成员。
      • 静态构造函数:初始化静态成员。
    • 析构函数(Destructor):在对象被销毁前执行清理工作。
  3. 嵌套类型:类中可以定义的其他类或结构。

示例代码

以下是C#中定义一个简单的类的例子:

using System;

// 定义一个类
public class Person
{
   
    // 数据成员
    private string name;
    public int Age {
    get; set; }
    
    // 函数成员
    public void Eat()
    {
   
        Console.WriteLine("Eating");
    }
    
    public void Sleep()
    {
   
        Console.WriteLine("Sleeping");
    }
    
    // 构造函数
    public Person(string name)
    {
   
        this.name = name;
    }
    
    // 静态构造函数
    static Person()
    {
   
        Console.WriteLine("Static constructor executed.");
    }
    
    // 嵌套类型
    public class InnerClass
    {
   
        public void Display()
        {
   
            Console.WriteLine("Inner class method.");
        }
    }
}

public class Program
{
   
    public static void Main()
    {
   
        // 创建Person类的实例
        Person person = new Person("Alice");
        person.Eat();
        person.Sleep();
        
        // 创建嵌套类的实例
        Person.InnerClass innerClass = new Person.InnerClass();
        innerClass.Display();
    }
}

在这个示例中,Person类有两个数据成员(nameAge),两个方法(EatSleep),一个构造函数,一个静态构造函数和一个嵌套类型(InnerClass)。Main方法展示了如何创建Person对象和InnerClass对象的实例。

类是面向对象编程中实现封装和抽象的基础,是构建软件时组织代码的逻辑单元。

7.2.2 类的声明

在C#中,可以通过类修饰符来控制类的可见性和可访问性。以下是一些常用的类修饰符:

  1. public

    • 描述:类可以被任何其他类访问。
    • 例如:public class Car { ... }
  2. private

    • 描述:类只能在定义它的程序集中访问。
    • 例如:private class Car { ... }(不常用,因为通常嵌套类使用private)
  3. internal

    • 描述:类只在当前程序集中可访问。
    • 例如:internal class Car { ... }
  4. protected

    • 描述:类可以被定义它的类以及其派生类访问(不常用于类本身,常用于
<think>嗯,用户之前已经问过Java中的public和public static,现在转而问C#中的访问修饰符。这说明他们可能在学习面向对象编程,尤其是C#,或者在比较不同语言之间的访问控制机制。 首先,我需要确认C#中的访问修饰符有哪些。根据记忆,C#有public、private、protected、internal,还有protected internal和private protected。需要逐一确认它们的定义和使用场景,确保准确性。 然后,用户可能已经了解Java的访问修饰符,所以在回答时可能需要对比Java和C#的不同之处,比如C#的internal在Java中没有直接对应,而Java的默认访问级别是包内可见,而C#默认是private。但用户没有明确要求比较,所以可能不需要深入,但可以作为补充。 接下来,要考虑用户的需求层次。他们可能想了解各个修饰符的作用、使用场景以及示例,以便在实际编程中正确使用。需要结构清晰,分点说明,每个修饰符的定义、作用、示例代码和使用场景,这样有助于理解和记忆。 还要注意用户之前的问题中提到的系统级指令,比如使用中文,数学公式的格式,但这里可能不涉及数学内容。另外,回答要结构清晰,分步骤解决问题,确保真实可靠,可能需要引用官方文档或权威资料。 需要检查是否有遗漏的访问修饰符。比如C# 7.2引入了private protected,这个容易被忽略,需要确认版本支持情况,但通常用户可能使用的是较新版本,所以应该包含进去。 另外,可能需要提醒用户某些修饰符的组合使用或注意事项,比如internal protected和protected internal是否相同(在C#中是相同的),以及它们的访问范围。避免混淆。 最后,总结部分需要对比各个修饰符的访问级别,可以用表格形式,这样更直观。同时,强调默认的访问级别是private,避免用户误解。 需要避免错误,比如确保internal是同一程序集内访问,而protected internal是同一程序集或派生访问。同时,private protected是同一程序集中的派生,这个在C# 7.2引入,可能需要特别说明。 示例代码部分要简单明了,每个修饰符对应一个例子,展示它们的可见性。同时,指出哪些情况会导致编译错误,帮助用户理解限制。 可能用户在使用过程中遇到了访问权限的问题,或者在设计库时需要控制成员的可见性,所以实际应用场景的说明也很重要,比如开发或团队协作中的使用。 需要确保回答准确,没有过时信息。比如,C#的访问修饰符是否有更新,或者是否有新的修饰符加入,但根据目前知识,C#的访问修饰符包括上述几种,没有新增的。 最后,语言要简洁明了,符合中文表达习惯,避免技术术语过多导致理解困难,但也要保证专业性。</think>在 C# 中,访问修饰符(Access Modifiers)用于控制、方法、属性或字段的可见性和访问权限。除了 `public` 和 `static`(`static` 是修饰符但不是访问修饰符),以下是 C# 中所有的 **访问修饰符** 及其用途: --- ### 一、核心访问修饰符 #### 1. **`public`** - **作用**:完全公开,无访问限制。 - **示例**: ```csharp public class MyClass { public int Value; // 任何代码均可访问 } ``` #### 2. **`private`** - **作用**:仅在声明它的或结构体内部可见。 - **示例**: ```csharp class MyClass { private int _secret; // 仅当前内部可访问 } ``` #### 3. **`protected`** - **作用**:在当前及其派生中可见。 - **示例**: ```csharp class BaseClass { protected int _protectedValue; // 派生可访问 } class DerivedClass : BaseClass { void Method() { _protectedValue = 10; // 允许访问 } } ``` #### 4. **`internal`** - **作用**:在同一程序集(Assembly)内可见,跨程序集不可访问。 - **典型用途**:开发时隐藏内部实现。 - **示例**: ```csharp internal class InternalUtils { internal static void HelperMethod() { ... } } ``` #### 5. **`protected internal`** - **作用**:联合 `protected` 和 `internal` 的权限: - 当前程序集内的任何代码。 - 其他程序集中的派生。 - **示例**: ```csharp class MyClass { protected internal int HybridValue; } ``` #### 6. **`private protected`**(C# 7.2+) - **作用**:仅在 **同一程序集内的派生** 中可见。 - **示例**: ```csharp class BaseClass { private protected int _value; } class DerivedInSameAssembly : BaseClass { void Method() { _value = 5; // 允许访问(同一程序集) } } ``` --- ### 二、默认访问修饰符 - **的默认修饰符**:`internal`(如果未显式声明)。 - **成员的默认修饰符**:`private`(如果未显式声明)。 ```csharp class DefaultClass { // 默认为 internal int _defaultField; // 默认为 private } ``` --- ### 三、访问修饰符的作用范围对比 | 修饰符 | 当前 | 派生(同程序集) | 派生(跨程序集) | 同程序集非派生 | 跨程序集非派生 | |--------------------|--------|---------------------|---------------------|-------------------|-------------------| | `public` | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | `private` | ✔️ | ❌ | ❌ | ❌ | ❌ | | `protected` | ✔️ | ✔️ | ✔️ | ❌ | ❌ | | `internal` | ✔️ | ✔️ | ❌ | ✔️ | ❌ | | `protected internal`| ✔️ | ✔️ | ✔️ | ✔️ | ❌ | | `private protected`| ✔️ | ✔️(仅同程序集) | ❌ | ❌ | ❌ | --- ### 四、使用场景与注意事项 1. **封装性原则**: - 优先使用最小可见性(如 `private`),仅在必要时扩大范围。 - 避免滥用 `public`,防止外部代码直接修改内部状态。 2. **开发**: - 用 `internal` 隐藏不需要暴露的实现细节。 - 用 `protected internal` 开放部分功能给派生或合作程序集。 3. **跨程序集访问**: - 若需跨程序集共享派生功能,可使用 `protected` 或 `protected internal`。 --- ### 五、示例代码片段 ```csharp // 程序集 A public class LibraryClass { private int _secret; // 仅当前可见 protected internal string Code; // 同程序集或派生可见 private protected DateTime Stamp; // 同程序集的派生可见 } // 程序集 B(引用程序集 A) class Consumer { void Method() { var obj = new LibraryClass(); // obj.Code = "test"; // 错误!跨程序集非派生无法访问 } } class DerivedInAnotherAssembly : LibraryClass { void Method() { Code = "allowed"; // 允许(派生访问 protected internal) // Stamp = DateTime.Now; // 错误!跨程序集无法访问 private protected } } ``` --- ### 六、总结 C# 的访问修饰符提供了精细的可见性控制,合理使用可以: - 提高代码安全性 - 降低模块间耦合度 - 明确代码设计意图 实际开发中需根据场景选择最合适的修饰符,尤其注意 `protected internal` 和 `private protected` 的细微区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值