You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#代码后置中如何在同一命名空间的另一个类里引用公共变量?

如何在同一命名空间的另一个类中引用页面类的公共实例变量

嘿,我来帮你解决这个问题~你遇到的核心问题是:numAnswers是benchmark类的实例成员(非静态),而你尝试直接通过类名benchmark.numAnswers访问,这在C#里是不允许的——实例成员必须通过类的具体实例来访问,而不是类本身。

下面给你两种可行的解决方案,还有一些关键注意事项:

方案1:传递benchmark实例给BenchmarkAdd(推荐)

这是最安全、符合面向对象设计的方式,因为ASP.NET页面类(比如你的benchmark)每个请求都会创建一个新实例,传递实例能确保你访问的是当前请求对应的numAnswers值。

修改方式一:给GetScore方法添加参数

namespace CADE.results {
    public partial class benchmark : BasePage {
        // 建议把string改成int,因为你要做自增操作,string不能直接用++
        public int numAnswers = 0; 
        protected void Page_Load(object sender, EventArgs e) {
            BenchmarkAdd bma = new BenchmarkAdd();
            // 传递当前页面实例this给GetScore方法
            bma.GetScore(this);
        }
    }
    public class BenchmarkAdd {
        public BenchmarkAdd() { }
        // 接收benchmark实例作为参数
        public void GetScore(benchmark pageInstance) {
            // 通过实例访问numAnswers并自增
            pageInstance.numAnswers++; 
        }
    }
}

修改方式二:通过构造函数注入实例

如果BenchmarkAdd需要多次使用benchmark的实例,这种方式更简洁:

namespace CADE.results {
    public partial class benchmark : BasePage {
        public int numAnswers = 0;
        protected void Page_Load(object sender, EventArgs e) {
            // 创建BenchmarkAdd时传入当前页面实例
            BenchmarkAdd bma = new BenchmarkAdd(this);
            bma.GetScore();
        }
    }
    public class BenchmarkAdd {
        // 保存页面实例的私有字段
        private readonly benchmark _pageInstance;
        
        // 构造函数接收实例
        public BenchmarkAdd(benchmark pageInstance) {
            _pageInstance = pageInstance;
        }
        
        public void GetScore() {
            _pageInstance.numAnswers++;
        }
    }
}

方案2:将numAnswers改为静态变量(谨慎使用)

如果你确定numAnswers是全局共享的(比如整个应用只需要一个统一值),可以把它改成静态成员,这样就能直接通过类名访问:

namespace CADE.results {
    public partial class benchmark : BasePage {
        // 添加static关键字,将成员变为类共享
        public static int numAnswers = 0;
        protected void Page_Load(object sender, EventArgs e) {
            BenchmarkAdd bma = new BenchmarkAdd();
            bma.GetScore();
        }
    }
    public class BenchmarkAdd {
        public BenchmarkAdd() { }
        public void GetScore() {
            // 直接通过类名访问静态变量
            benchmark.numAnswers++;
        }
    }
}

⚠️ 重要提醒:ASP.NET中静态变量会在应用域内共享,所有用户的请求都会共用这个值,很容易导致数据混乱(比如用户A的操作会影响用户B的numAnswers),除非你真的需要全局共享状态,否则强烈不推荐这种方式。

额外小纠正

你原来的代码里numAnswers是string类型却尝试用++自增——这在C#里是编译错误的,因为++运算符只适用于数值类型。所以建议把numAnswers改成int类型,这样自增操作才合法。

内容的提问来源于stack exchange,提问作者Velocedge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:12:51