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

C#自定义Struct创建新实例后默认值异常变化问题求解

问题根源

你的代码核心错误是混淆了结构体的静态字段和实例字段的作用域,同时存在基础语法错误,具体问题如下:

  • 没有为RequestNumber定义实例级别的序列号存储字段,所有实例的Sequence属性都读取同一个静态变量_sequence,这就导致不管是你主动创建的实例,还是default(RequestNumber)默认实例,获取到的Sequence永远是最新的全局序列号,自然会出现request2.Number.Equals(default(RequestNumber))返回true的问题。
  • CreateNext方法中使用的number变量未定义,代码本身无法通过编译,你实际想引用的应该是当前静态存储的序列号_sequence。
  • 你对default(RequestNumber)的预期存在偏差:值类型的默认值是所有字段赋值为对应类型默认值的实例,正常逻辑下default(RequestNumber)的序列号应该为0,而非1。

修正后的代码

RequestNumber 结构体

public struct RequestNumber 
{
    // 静态字段:存储下一个要分配的全局序列号
    private static int _nextSequence = 1;
    // 实例字段:存储当前结构体实例自己的序列号
    private readonly int _sequence;

    public int Sequence { get { return _sequence; } }

    public RequestNumber(int number)
    {
        _sequence = number;
    }

    public static RequestNumber CreateNext()
    {
        var currentNumber = _nextSequence;
        // 计算下一个序列号,超过50就重置为1
        _nextSequence = _nextSequence >= 50 ? 1 : _nextSequence + 1;
        return new RequestNumber(currentNumber);
    }

    // 重写Equals和GetHashCode保证比较逻辑符合预期
    public override bool Equals(object obj)
    {
        return obj is RequestNumber number && _sequence == number._sequence;
    }

    public override int GetHashCode()
    {
        return _sequence.GetHashCode();
    }
}

Request 类

你的Request类本身没有逻辑错误,保持原有实现即可:

public class Request
{
    public RequestNumber Number { get; }
    public Request()
    {
        Number = RequestNumber.CreateNext();
    }
}

效果验证

修正后:

  1. 创建第一个Request实例,Number值为1
  2. 创建第二个Request实例,Number值为2
  3. default(RequestNumber).Sequence值为0,request2.Number.Equals(default(RequestNumber))返回false,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:54:04