类的成员访问方式

博客介绍了类成员的访问规则,一般成员需通过对象访问,类外不能用对象访问私有数据成员,而静态成员还可通过类名进行访问。
一般成员只有通过对象才能访问,类外不可用对象访问私有数据成员。静态成员也可通过类名访问。
<think>我们正在讨论C#中成员的不同访问方式。根据提供的引用,我们可以总结如下:1.**访问修饰符**:C#提供了多种访问修饰符来控制成员的可访问性:-`public`:访问不受限制,任何地方都可以访问。-`private`:只能在声明它的内部访问,其他(包括派生)都无法访问。-`protected`:只能在声明它的内部以及该的派生访问。-`internal`:只能在同一个程序集(项目)内访问。-`protectedinternal`:相当于`protected`或`internal`,即可以在同一个程序集内访问,也可以在该的派生访问(即使派生在不同程序集)。2.**默认访问修饰符**:-成员的默认访问修饰符是`private`(引用[4])。-命名空间中直接声明的可以用`public`或`internal`,默认是`internal`(引用[4])。3.**不同上下文中的访问规则**:-在同一个中,所有成员都可以访问。-在同一个程序集的另一个中:-可以访问`public`、`internal`和`protectedinternal`成员(如果是在派生中,还可以访问`protected`成员)。-在不同程序集的另一个中:-只能访问`public`成员。-在派生中可以访问`protected`和`protectedinternal`成员(引用[5])。4.**示例说明**:-引用[1]中的示例:在`ClassA`中定义了5个不同访问修饰符的属性。在`ClassB`(非派生)中,只能访问`public`和`internal`成员。在`ClassC`(派生)中,可以访问`public`、`protected`、`internal`、`protectedinternal`成员,但不能访问`private`成员。-引用[3]中的示例:在派生中,通过基的实例无法访问的`protected`成员(因为`protected`成员只能通过派生的实例在派生内部访问,而不能通过基的实例访问)。5.**特殊成员**:-构造函数:默认是`public`,但可以设置为其他访问级别(引用[4])。-析构函数:不能显示使用访问修饰符,默认为`private`(引用[4])。-静态成员:使用`static`修饰,属于而不是实例,可以通过类名访问(引用[2])。6.**继承中的访问**:-派生可以继承基的`public`、`protected`、`internal`(在同一程序集内)、`protectedinternal`成员(引用[5])。-但是,派生不能直接访问的`private`成员(引用[5]示例中,通过基的公有属性或方法间接访问私有字段)。下面我们用一个示例来详细说明:```csharpnamespaceAccessibilityExample{publicclassBaseClass{publicintpublicMember=1;privateintprivateMember=2;protectedintprotectedMember=3;internalintinternalMember=4;protectedinternalintprotectedInternalMember=5;}publicclassDerivedClass:BaseClass{publicvoidAccessBaseMembers(){//可以访问public,protected,internal,protectedinternal成员Console.WriteLine(publicMember);//Console.WriteLine(privateMember);//错误:无法访问私有成员Console.WriteLine(protectedMember);Console.WriteLine(internalMember);Console.WriteLine(protectedInternalMember);}}publicclassOtherClass{publicvoidAccessBaseMembers(){BaseClassbaseObj=newBaseClass();Console.WriteLine(baseObj.publicMember);//Console.WriteLine(baseObj.privateMember);//错误//Console.WriteLine(baseObj.protectedMember);//错误:只能在派生访问Console.WriteLine(baseObj.internalMember);//同一程序集内可以访问Console.WriteLine(baseObj.protectedInternalMember);//同一程序集内可以访问}}}```总结:-`public`:无限制。-`private`:仅本。-`protected`:本及派生。-`internal`:同一程序集内。-`protectedinternal`:同一程序集内或派生(跨程序集也可访问派生中的该成员)。注意事项:-在派生中,不能通过基的实例访问的`protected`成员(引用[3]示例)。-访问级别也受程序集边界的影响。§§相关问题§§1.C#中,如何在不同程序集中访问另一个程序集的成员?2.C#中,`protectedinternal`和`privateprotected`有什么区别?3.为什么在派生中不能通过基实例访问的protected成员?</think>### C# 成员访问方式详解 在C#中,成员访问方式由**访问修饰符**控制,它们决定了成员的可访问范围。以下是核心访问修饰符及其规则总结: #### 🔐 1. 访问修饰符概览 | 修饰符 | 访问范围 | 示例场景 | |---------------------|--------------------------------------------------------------------------|------------------------------| | `public` | 完全公开,任何位置均可访问 | 全局工具方法 | | `private` (默认) | 仅限**声明内部**访问,子和外部均不可见 | 内部状态字段 | | `protected` | 允许**声明及其子**访问(可跨程序集) | 基提供的可继承方法 | | `internal` | 仅限**同一程序集(项目)** 内访问 | 项目内部工具 | | `protected internal`| `protected` 或 `internal` 的组合(同一程序集或子访问) | 项目内可继承的共享资源 | #### 🧩 2. 关键规则详解 1. **默认访问级别** - 成员默认是 `private`(引用[4]) - 命名空间中的默认是 `internal`(引用[4]) 2. **继承中的访问规则** - 子访问的 `public`/`protected`/`protected internal` 成员 - **禁止通过基实例访问`protected`成员**(引用[3]): ```csharp class Base { protected int b; } class Derived : Base { void Init() { Base obj = new Base(); obj.b = 10; // ❌ 编译错误:基实例不能访问自身protected成员 } } ``` 3. **跨程序集规则** - `public`:任意程序集可访问 - `protected`:仅子可跨程序集访问(引用[5]) - `internal`:仅限同一程序集 ```mermaid graph LR A[程序集A] -->|public| B(程序集B) A -->|protected| C[程序集A的子] A -->|internal| D[程序集A内部] ``` 4. **特殊型限制** - 结构体(`struct`):成员不能声明为 `protected`(不支持继承) - 接口(`interface`):成员隐式为 `public` - 静态:所有成员必须为静态(引用[2]) #### ⚡ 3. 实战示例 ```csharp namespace Demo { public class Base { public int Pub; // ✅ 全局可访问 private int Priv; // ❌ 仅Base内可用 protected int Prot; // ✅ Base及子访问 internal int Inter; // ✅ 同一程序集内可访问 protected internal int ProInt; // ✅ 子或同一程序集 } public class Derived : Base { public void AccessCheck() { Pub = 10; // ✅ 允许:public成员 Prot = 20; // ✅ 允许:protected成员(子访问) Inter = 30; // ✅ 允许:同一程序集internal ProInt = 40; // ✅ 允许:protected internal // Priv = 50; // ❌ 编译错误:private不可访问 } } public class Unrelated { public void Check(Base b) { b.Pub = 1; // ✅ 允许:public b.Inter = 2; // ✅ 允许:同一程序集internal // b.Prot = 3; // ❌ 错误:非子不能访问protected // b.ProInt = 4;// ❌ 错误:非子且非protected场景 } } } ``` #### 💡 4. 设计建议 1. **最小化暴露原则**:优先使用 `private`,必要时升级访问级别 2. **继承控制**: - 允许子扩展 → `protected` - 禁止继承 → `sealed` 或 `private` 3. **程序集封装**: - 组件内部实现 → `internal` - 公开API → `public` > 关键提示:访问修饰符是实现**封装性**的核心机制,合理使用可提升代码安全性和可维护性(引用[1][4][5])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值