[英]Constructor with string parameter and identical overload with object parameter
我的類目前有兩個構造函數,它們是重載:
public CustomRangeValidationAttribute(string value) {}
和
public CustomRangeValidationAttribute(object value) {}
這似乎工作正常:當我使用string
調用方法時,第一個構造函數被調用,當我使用不同的值,例如integer
或boolean
,第二個構造函數被調用。
我假設有一個規則強制特定類型匹配進入更具體的重載,防止
var c = new CustomRangeValidationAttrubute("test");
從調用對象過載。
這是“安全代碼”,還是應該(或可以)改進代碼? 我有一種嘮叨的感覺,這不是最好的做法。
一旦出現帶有更多派生類型簽名的重載,編譯器將始終選擇您提供的大多數具體類型。
話雖這么說,除非有人做了new CustomRangeValidationAttrubute((object)"test")
如果你將字符串傳遞給CustomRangeValidationAttrubute
始終選擇帶有string
構造函數。
如果這是不好的做法,我無法確定我是否看不到您的具體用例,請記住,您傳遞給new CustomRangeValidationAttrubute(object)
每個值類型都將被裝箱,這是不好的,因為它放置對GC的壓力和更多你將失去類型安全。
您有兩個重載,這些重載僅在引用類型中有所不同,並且引用類型之間存在層次關系,因此可以將其轉換為另一個。
在這種情況下,當選擇更廣泛的重載但參考結果是更多派生類型1,2時,您確實應該確保代碼在邏輯上的行為相同。 這是集中注意力的地方。 當然,如果你堅持這個規則,通常會發現不需要更多派生的重載,並且可以在更廣泛的方法中使用特殊的重載。
1特別是因為,正如vc74在注釋中指出的那樣,在編譯時基於編譯時類型3完成重載決策(通常忽略dynamic
)。
2這適用於過載的相同廣泛原則。 沒有選擇一個選項導致邏輯上不同的結果的重載。 如果你展示了不同的行為,不要給它們相同的名稱(對於構造函數,這可能意味着分成兩個單獨的類,可能有一個共享的基類,如果這是你打算做的)
3我很欣賞這是一個屬性,所以你只希望編譯時是相關的,但我仍然會在這里盡可能地跟普通校長一起。
我解決這個代碼的方法是通過使用單獨的方法而不是原始構造函數將重載移動到新的抽象類:
public CustomRangeValidationStringAttribute(string value) {}
public CustomRangeValidationGenericAttribute(object value) {}
在從這個新基類繼承的兩個類中,每個類都使用自己的方法,創建兩個不同的屬性供您選擇,[CustomRangeValidationString]和[CustomRangeValidationGeneric]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.