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(); } }
效果验证
修正后:
- 创建第一个Request实例,Number值为1
- 创建第二个Request实例,Number值为2
default(RequestNumber).Sequence值为0,request2.Number.Equals(default(RequestNumber))返回false,符合预期。
内容的提问来源于stack exchange,提问作者ncxzthkta
相关产品推荐
相关产品推荐

