我正在创建一个程序,它加载一个程序集文件(.dll)并在一个间隔内执行程序集文件中的方法,然后尝试将结果存储在字典中。完整代码是here(pastebin.com)。我的问题是,似乎在计时器上向字典添加内容会导致字典无法更新。我能够将重现此问题的相关代码减少到以下内容:
type SomeThing() as this =
do
let timer = new System.Timers.Timer()
timer.Elapsed.Add(this.AddItem)
timer.Interval <- 3000.0
timer.Enabled <- true
timer.Start()
member this.MyDict = new System.Collections.Generic.Dictionary<string, string>()
member this.AddItem _ =
this.MyDict.Add("hello", "world")
printfn "%A" this.MyDict
let mything = new SomeThing()
如果在交互式会话或LINQPad之类的内容中运行,结果是输出:
seq []
seq []
.
.
.
显然字典没有改变。我还在Visual Studio调试器中确认字典没有更改。这几乎就像跳过了MyDict.Add一行。我假设这与我使用type / do语句有关,因为使用计时器和类型之外的字典似乎没有问题。
有人能指出我做错了吗?
答案 0 :(得分:9)
问题在于:
member this.MyDict = new System.Collections.Generic.Dictionary<string, string>()
这是一个只读属性,其返回表达式为new System.Collections.Generic.Dictionary<string, string>()
。即,每次读取属性时,都会返回一个新的不同字典。如果有帮助,这就是它在C#中的样子:
Dictionary<string, string> MyDict => new Dictionary<string, string>();
以下是您使用automatically implemented properties:
的内容member val MyDict = new System.Collections.Generic.Dictionary<string, string>() with get
等价C#:
Dictionary<string, string> MyDict { get; } = new Dictionary<string, string>();