泛型IEnumerable类的Get/Set方法实现及自定义对象适配问题
泛型类属性栈溢出与自定义对象适配问题的解决
问题根源
原代码中Data属性的写法存在致命逻辑错误:
get方法直接返回this.Data,会无限递归调用自身的getter,最终触发栈溢出set方法中直接执行Data = value,同样会无限递归调用自身的setter,也是栈溢出的诱因- 注释set中的赋值语句后,getter的无限递归依然存在,string类型实例看似正常属于偶然的运行时优化,但自定义对象类型会因持续递归调用引发内存访问异常("Unable to read memory")
解决方案
必须为属性定义私有后备字段(backing field),用于实际存储数据,属性的get/set操作均针对该字段而非属性自身。同时可在setter中嵌入自定义逻辑(如数据验证、状态通知等)。
完整实现代码
public class MyEnumClass<T> : IEnumerable<MyEnumClass<T>> { // 私有后备字段,负责实际存储Data的值 private T _data; public T Data { get { return _data; } set { // 示例自定义逻辑:仅当值发生变化时执行赋值与后续操作 if (!EqualityComparer<T>.Default.Equals(_data, value)) { _data = value; // 这里可添加你的自定义逻辑,比如日志记录、事件通知等 OnDataUpdated(); } } } public MyEnumClass(T data) { Data = data; } // 自定义逻辑示例:属性值更新时的处理方法 private void OnDataUpdated() { Console.WriteLine("Data属性已完成更新"); } // 实现IEnumerable接口的必要方法(原代码未实现,需补充) public IEnumerator<MyEnumClass<T>> GetEnumerator() { // 根据业务需求实现枚举逻辑,示例返回自身的枚举 yield return this; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } // 自定义对象示例 public class MyOwnObjectType { public string Name { get; set; } public int Age { get; set; } }
测试代码
// string类型实例化 var stringInstance = new MyEnumClass<string>("Foo"); Console.WriteLine(stringInstance.Data); // 输出: Foo // 自定义对象类型实例化 var customObj = new MyOwnObjectType { Name = "Test", Age = 25 }; var customInstance = new MyEnumClass<MyOwnObjectType>(customObj); Console.WriteLine(customInstance.Data.Name); // 输出: Test // 修改Data属性,触发自定义逻辑 customInstance.Data = new MyOwnObjectType { Name = "NewTest", Age = 30 };
内容的提问来源于stack exchange,提问作者user10149299
相关产品推荐
相关产品推荐

