只是想知道使用函式或屬性時的最佳實踐是什么。我有一堂課
Class Person
Property FirstName as String
Property LastName as String
'code to use
Return $"{LastName.ToUpper}, {FirstName}"
End Class
最好的方法是什么?
- 只讀屬性 FullName 作為字串
- 函式全名作為字串
- 共享函式 FullName(p as Person) 作為字串
我的理解是 3 會更好,因為 1 或 2 將是物件的一部分,但是它們對物件所做的事情并沒有什么獨特之處,因此每個 Person 物件都會重復相同的代碼。
uj5u.com熱心網友回復:
我的理解是 3 會更好,因為 1 或 2 將是物件的一部分,但是它們對物件所做的事情并沒有什么獨特之處,因此每個 Person 物件都會重復相同的代碼。
不,代碼不重復。一個類的所有物件實體都包含它們自己的欄位副本,但記憶體中只有一份代碼副本。
實體方法可以被視為以物件實體作為其第一個引數的共享方法的語法糖,因此在記憶體使用方面,2 和 3 沒有區別。不過,選項 2 比選項 3 有一些優勢:
- 它更慣用:
myPerson.GetFullName()比Person.GetFullName(myPerson). - 如果需要,它允許您添加多型性:可以在子類中重寫實體方法,并且可以使用實體方法來實作介面。
只讀屬性可以被認為是實體方法的語法糖,因此 1 和 2 之間也沒有太大區別。Microsoft 發布了在這兩者之間進行選擇的指南:
- 在屬性和方法之間進行選擇
特別是,如果“成員表示該型別的邏輯屬性” ,它建議選擇一個屬性,這里就是這種情況。它還列出了選擇方法的一些標準(昂貴的操作、轉換、后續呼叫的不同結果、副作用、狀態副本),這些都不適用。因此,我會說選項 1 是一個明顯的贏家。
uj5u.com熱心網友回復:
在寫這個答案的時候,有一個投票結束你的問題,因為它“可能會用意見而不是事實和參考來回答”。關于您3.的情況肯定不是這樣,因為單獨的共享成員只能直接訪問共享成員,所以這是不可能的。至于1.和2.,這就是它們的樣子:
Class Person
Public Property FirstName as String
Public Property LastName as String
Public Function GetFullName() As String
Return $"{LastName.ToUpper}, {FirstName}"
End Function
Public ReadOnly Property FullName As String
Public Get
Return $"{LastName.ToUpper}, {FirstName}"
End
End Property
End Class
打電話給他們:
Dim p As New Person() With {.FirstName = "John", .LastName = "Doe"}
Console.WriteLine(p.GetFullName())
Console.WriteLine(p.FullName)
美國能源部,約翰
美國能源部,約翰
兩者都做同樣的事情。意見部分來了:
在這種情況下,我更喜歡該屬性,因為它沒有做太多作業。我希望一種方法可以在幕后做更多的作業——我不希望一個屬性需要很長時間才能運行,但是可以使用一種延遲一點的方法——但這有點主觀。從這個答案中,“方法意味著這樣做,而屬性意味著獲取一些資料。” 我同意(也同意問答中的其他一些好資訊)。
將共享函式歸類到此答案的一種方法是撰寫一個可由實體成員使用的函式,但它不能直接訪問名稱屬性。至于公共 API,問題仍然在1.和之間2.。它可能看起來像這樣
Class Person
Public Property FirstName As String
Public Property LastName As String
Public Function GetFullName() As String
Return getFullName(FirstName, LastName)
End Function
Public ReadOnly Property FullName As String
Get
Return getFullName(FirstName, LastName)
End Get
End Property
Private Shared Function getFullName(firstName As String, lastName As String)
Return $"{lastName.ToUpper}, {firstName}"
End Function
Private Shared Function getFullName(p As Person)
Return $"{p.LastName.ToUpper}, {p.FirstName}"
End Function
End Class
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426211.html
上一篇:Microsoft.Toolkit.Forms.UI.Controls找不到Windows運行時型別“Microsoft.Toolkit.Win32.UI.XamlHost.IXamlMetadata
