F#类成员无法保留状态:自定义List包装类状态丢失排查
问题分析与修复
核心问题
- 计算属性导致每次访问创建新List:
member this.List = List<char>()是计算属性,每次访问this.List都会生成全新的List<char>实例,完全无法保留之前添加的元素。 - AddX是属性而非方法:
member this.AddX = ...定义的是只读属性,调用mylist.AddX时只是读取属性值,并不会执行内部的添加逻辑(即便执行,也会因为List是新实例而无效)。
修复后的代码
open System open System.Collections.Generic open NUnit.Framework type MyList() = // 用let绑定创建私有字段,仅在实例化时初始化一次,持久保留状态 let internalList = List<char>() // 修改为方法,需通过括号调用执行逻辑 member this.AddX() = printfn "AddX called" internalList.Add('X') member this.CountX: int = printfn "CountX called" internalList.Count [<Test>] let TestX () = let mylist = MyList() // 调用方法必须加括号触发执行 mylist.AddX() mylist.AddX() Assert.AreEqual(2, mylist.CountX)
关键修改说明
- 私有字段替代计算属性:F#类中
let internalList = List<char>()会创建类内部私有字段,仅在实例化时初始化一次,确保状态持续保留。 - AddX改为方法:给成员添加
()定义为方法,调用时必须使用mylist.AddX()才能触发添加元素的逻辑。 - 直接操作私有字段:全程使用
internalList进行增查操作,彻底避免每次访问生成新List的问题。
内容的提问来源于stack exchange,提问作者R A
相关产品推荐
相关产品推荐

