F#中的类级别和成员级别自我标识符之间的区别?

bri*_*rns 7 f#

F#中的类级别和成员级别自标识符之间是否存在语义差异?例如,考虑这个类:

type MyClass2(dataIn) as self =
    let data = dataIn
    do
        self.PrintMessage()
    member this.Data = data
    member this.PrintMessage() =
        printfn "Creating MyClass2 with Data %d" this.Data
Run Code Online (Sandbox Code Playgroud)

与本课程相比:

type MyClass2(dataIn) as self =
    let data = dataIn
    do
        self.PrintMessage()
    member this.Data = data
    member this.PrintMessage() =
        printfn "Creating MyClass2 with Data %d" self.Data
Run Code Online (Sandbox Code Playgroud)

唯一的区别是PrintMessage的实现引用this了一个与self另一个.语义有什么不同吗?如果没有,是否有一种风格上的理由偏爱一个而不是另一个?

scr*_*wtp 5

两者之间没有真正的语义差异.根据经验,我建议您使用第一个示例 - 更喜欢范围更接近的标识符,以便以后更容易阅读和重构代码.作为旁注,人们通常会this同时使用类和成员级标识符,在这种情况下,成员级别的一个会影响类级别的标识符.

在这种情况下,查看像ILSpy这样的反汇编程序中的编译代码很有用.如果你这样做,你会发现唯一的区别是插入一个额外的空检查self.Data.

另一方面,使用类级别标识符的类与不使用类级别标识符的类(将一系列初始化检查插入到所有类成员中)之间存在差异.如果可能的话,最好避免使用它们,并且可以将您的示例重写为不需要它.