C#中字段访问限制的原因探究及两类场景解析
关于C#字段访问限制的两类场景解析
嘿,咱们逐个拆解这两个场景里的问题,其实核心都是C#的语法规则和访问修饰符的作用范围细节:
场景1:类顶级作用域的语法限制
你这里遇到的根本不是字段访问权限的问题,而是C#类的顶级作用域只能放成员声明,不能直接写执行代码。
看你的代码:
public class Customer { string _name = "Ram"; // 尝试在下一行给_name赋值 _name // 该行中此字段无法访问 }
_name的默认访问修饰符是private,在类内部的成员(比如方法、构造函数)里是完全可以访问的,但你把它写在了类的“根级别”——也就是和字段声明同一层级的位置。这个位置只能定义类的成员(字段、方法、属性、嵌套类等),不能直接执行赋值、引用字段这类操作。
如果要给_name赋值,得把代码放到类的成员里面,比如构造函数或者方法:
public class Customer { string _name = "Ram"; // 正确写法:在构造函数里赋值 public Customer() { _name = "Updated Ram"; } // 或者在方法里 public void ChangeName() { _name = "New Name"; } }
场景2:protected修饰符的访问上下文限制
这个场景的问题是protected修饰符的访问规则,加上非静态成员的访问上下文要求:
protected的规则是:基类的protected成员可以被派生类访问,但必须在派生类的实例成员上下文里——也就是在实例方法、构造函数、属性访问器这些有具体实例的地方。
看你的代码:
public class BaseCustomer { protected string _name; } public class DerivedCustomer : BaseCustomer { _name // 此处无法访问 public void SetName() { _name = "Shyam"; // 此处可访问 } }
- 直接写在
DerivedCustomer类顶级作用域的_name:这里没有实例上下文,你相当于在试图访问一个非静态成员,但又不是在任何实例成员内部,不管它是protected还是public,这种写法都是不合法的。 - 而
SetName方法是实例方法,默认隐含了this上下文(也就是当前DerivedCustomer的实例),在这个上下文里,派生类可以正常访问基类的protected成员,所以_name = "Shyam"是完全合法的。
简单总结一下:
- 场景1:错在代码位置,类顶级作用域不能写执行语句,和字段权限无关
- 场景2:错在访问上下文,
protected成员需要在派生类的实例成员内部才能访问,顶级作用域没有实例上下文
内容的提问来源于stack exchange,提问作者Kgn-web
相关产品推荐
相关产品推荐

