C#中如何访问类内不可访问的defaultChar对象(不设public)
问题分析与解决方案
首先,你的代码里有两个核心问题:
defaultChar是私有实例字段:C#中类成员默认访问级别是private,所以外部无法访问;而且它是实例字段,意味着每创建一个Character对象,都会生成一个全新的defaultChar实例,完全没必要——默认角色应该是类共享的全局实例。- 你尝试设
public但无效,大概率是没给字段加public修饰符(当前代码里defaultChar没有任何访问修饰符)。
推荐解决方案:使用静态只读属性(最符合C#设计规范)
把defaultChar改成类级别的静态只读属性,这样所有代码都能访问,且默认实例不会被意外修改,也不会重复创建:
修改后的Character类:
public class Character { public string alias { get; set; } // 静态只读属性,类共享的默认实例 public static Character DefaultChar { get; } = new() { alias = "No Encontrado", }; }
然后在Program里直接通过类名访问,不需要创建Character实例:
public class Program { public static void Main() { Console.WriteLine(Character.DefaultChar.alias); // 正常输出 "No Encontrado" } }
为什么不推荐实例字段?
如果把defaultChar改成public实例字段(public Character defaultChar = new(...)),虽然能解决访问问题,但每个Character对象都会自带一个defaultChar实例,完全是资源浪费——默认角色只需要一个全局的就够了。
关于“方法返回会产生大量数据”的误区
C#中引用类型(比如Character类的对象)的返回值是引用地址,不是整个对象的复制,所以即使写个方法返回defaultChar,也不会产生大量数据,比如:
public class Character { private static readonly Character _defaultChar = new() { alias = "No Encontrado" }; public static Character GetDefaultChar() { return _defaultChar; } }
但静态属性比方法更简洁直观,更适合这种场景。
内容的提问来源于stack exchange,提问作者MintJungle
相关产品推荐
相关产品推荐

