Java与C#声明初始化变量的差异及C#要求变量为static的问题咨询
问题原因及解决方案
核心触发原因
- 最常见的场景是你在静态上下文(静态方法、静态属性、静态构造函数等)中直接访问了非静态的实例成员。C# 中静态成员属于类本身,不绑定到具体的类实例,而你声明的非静态
MailMerger变量只有在类的实例被创建后才会完成初始化,静态上下文执行时无法保证对应的类实例已经存在,因此编译器会要求你将该变量改为静态。 - 另一种可能是你访问变量时误用了类名作为前缀,而非具体实例对象,例如写
类名.MailMerger变量而非实例对象.MailMerger变量,前者是访问静态成员的语法,也会触发此类报错。

错误写法示例
public class MailOperator { // 声明非静态实例变量 private MailMerger mailMerger; public MailOperator() { // 构造函数中初始化实例变量 mailMerger = new MailMerger(); } // 静态方法属于静态上下文 public static void SendMails() { // 这里直接访问实例变量会触发编译错误 mailMerger.Merge(); } }
对应解决方案
- 如果
MailMerger需要每个类实例单独持有:将访问该变量的静态方法改为非静态,或是在静态上下文里先创建类的实例,再通过实例访问该变量。 - 如果
MailMerger全局共用,不需要每个实例单独初始化:将变量声明为static,可以在声明时直接初始化,或是在静态构造函数中完成初始化。
内容的提问来源于stack exchange,提问作者Hadi Hoteit
相关产品推荐
相关产品推荐

