我在类中定义了一个属性,如:
type Customer() =
let mutable _lastName = String.Empty
member val LastName = _lastName with get
Run Code Online (Sandbox Code Playgroud)
在方法QueryData中,我为_lastName赋值:
member self.QueryData () =
// CODE
let addressData = bp.GetStructure("PE_PERSONALDATA")
_lastName <- addressData.GetString("LASTNAME")
null
| RfcCommunication ex ->
let basedComm = ex :> Exception
basedComm
| RfcLogon ex ->
let basedLogon = ex :> Exception
basedLogon
| RfcAbapRuntime ex ->
let basedAbap = ex :> Exception
basedAbap
Run Code Online (Sandbox Code Playgroud)
在main函数中,我创建了一个Customer()实例并读取LastName属性:
[<EntryPoint>]
let main argv =
let customer = CustomerBapi.Customer()
let ex = customer.QueryData()
if ex <> null then printfn "%s" ex.Message
printfn "%s" customer.LastName
Run Code Online (Sandbox Code Playgroud)
结果是空字符串.我试图调试程序,看到_lastName不为空
为什么LastName属性为空?
您的财产应如下所示:
member this.LastName with get () = _lastName
Run Code Online (Sandbox Code Playgroud)
您正在使用的属性类型_lastName作为值进行初始化.
MSDN的解释:
保存属性数据的私有值称为后备存储.要让编译器自动创建后备存储,请使用关键字成员val,省略自标识符,然后提供表达式以初始化属性.如果属性是可变的,请包含get,set.例如,以下类类型包括两个自动实现的属性.Property1是只读的,并初始化为提供给主构造函数的参数,Property2是一个初始化为空字符串的可设置属性:
type MyClass(property1 : int) =
member val Property1 = property1
member val Property2 = "" with get, set
Run Code Online (Sandbox Code Playgroud)