为何可在类外部访问并修改私有字段?以CancellationTokenSource为例
关于C#私有字段访问和CancellationTokenSource状态修改的疑问解答
你的代码示例如下:
using System.Threading; namespace MyGame { public class Game : Application { private readonly CancellationTokenSource _cts; public void Run() { RunAsync(_cts.Token).ConfigureAwait(false).GetAwaiter().GetResult(); } internal static void Main(string[]? args) { var game = new Game(); game._cts.Cancel(); game.Run(); } } }
针对你的两个疑问解答如下:
1. 为何类的私有字段能在Main方法中被访问?
Main是Game类的内部静态成员方法,C#的访问权限规则明确:同一类中的所有成员(包括静态成员)都可以访问该类的私有成员(字段、方法等)。不管是实例成员还是静态成员,只要属于同一个类,就不受私有访问限制的约束,所以Main方法能直接访问Game实例的私有_cts字段。
2. 为何能在Main方法中修改CancellationTokenSource的状态?
你这里并没有直接修改_cts这个私有字段本身(比如执行game._cts = new CancellationTokenSource()这种赋值操作),而是通过_cts获取到了CancellationTokenSource的对象引用,然后调用了它的公共方法Cancel()。
私有字段的访问限制仅针对字段自身的读写操作,而通过字段拿到对象实例后,调用该对象的公共API是完全合法的——Cancel()是CancellationTokenSource类的公开成员,任何持有该对象引用的代码都可以调用它来修改对象内部状态。
内容的提问来源于stack exchange,提问作者Redplcs
相关产品推荐
相关产品推荐

