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

C#未使用属性致代码崩溃,调试/非调试结果不一致求助

问题分析与解决方案

首先,咱们得揪出核心问题:你的Nehmen属性违反了C#属性的设计规范——属性的get访问器应该是无副作用的(也就是调用getter不应该改变对象的内部状态),但你的Nehmen getter里做了figur = 0的操作,这会直接修改对象的状态。

为什么未使用的Nehmen会导致崩溃/输出不一致?

在非调试模式下,C#编译器会启用各种优化(比如死代码消除、数据流分析)。虽然你没有调用Nehmen,但编译器在分析代码时,发现这个getter会修改figur字段,它可能会误判figur的使用场景:

  • 优化器可能认为figur的值是不可预测的,甚至错误地消除了feld.Setze = 5这个赋值操作(因为它觉得后续没有“有效”的读取操作);
  • 而调试模式下,编译器会禁用大部分优化,所以赋值和读取逻辑都能正常执行,输出符合预期的True。

当你删除Nehmen属性后,编译器能正确识别Setze的赋值和Besetzt的读取之间的依赖关系:Setze修改figur,Besetzt读取figur,所以优化器不会删除赋值操作,程序就能正常运行。

修复方案

你有几个选择来解决这个问题,同时遵循C#的设计规范:

  1. 把有副作用的操作改成方法:因为Nehmen的逻辑是“取出当前值并重置为0”,这明显是一个有副作用的操作,更适合做成方法而不是属性:
public int Nehmen() 
{ 
    int cur = figur; 
    figur = 0; 
    return cur; 
}

这样编译器不会把它当成属性的getter来分析,优化逻辑会恢复正常。

  1. 标记字段为被隐式使用:如果你坚持要用属性,可以给figur字段加上[UsedImplicitly]特性(需要引用System.Diagnostics.CodeAnalysis命名空间),告诉编译器这个字段是被隐式使用的,不要随意优化:
using System.Diagnostics.CodeAnalysis;

public class Feld 
{ 
    [UsedImplicitly]
    public int figur; 
    // 其他属性保持不变
}
  1. 给Setze添加get访问器:让Setze成为读写属性,这样编译器会明确知道这个属性的赋值是有意义的:
public int Setze 
{ 
    get => figur;
    set => figur = value; 
}

总结

本质问题是Nehmen属性的getter违反了无副作用的规范,触发了编译器优化的误判。调整这个属性的实现方式,就能解决调试/非调试模式的差异问题,同时让代码更符合C#的设计习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:30:11