[英]Should i define a struct for the sole purpose of one function?
我有一個需要自定義數據類型的函數,解決這個問題的一種方法是通過定義一個結構但是這只是一個函數,如果我只使用動態對象不是更好嗎?
例如:
public struct myDataType(){
public string name { get; set; }
public string email { get; set; }
public string token { get; set; }
}
public bool doSomething(string name, string email, string token){
myDataType MDT = new myDataType();
MDT.name = name;
MDT.email = email;
MDT.token = token;
//Do something with MDT
return 1;
}
要么
public bool doSomething(string name, string email, string token){
dynamic MDT = new ExpandoObject();
MDT.name = name;
MDT.email = email;
MDT.token = token;
//Do something with MDT
return 1;
}
注意:
雖然我可以在結構中定義所有可能的道具,但我不知道我需要使用多少道具。
示例並不真實,它只顯示了兩種可能的方法。
這不是dynamic
的目的。 如果在運行時之前不知道類型,則使用Dynamic(並且有充分的理由擁有這樣的場景)。 除此之外的用法只是降低了C#的強類型性質,允許編譯在運行時可能無效的代碼。
如果需要具有屬性B,C,D的對象A,則創建該對象,即使您打算使用它一次。 此外,當某些東西調用您的函數並需要訪問返回對象的屬性時,您將需要使用該對象。 這些屬性最好是已知且強類型的。 如果您願意,可以使用結構而不是類,但將其設置為強類型對象。
編輯:編輯原始問題以指示該函數不返回該對象。 盡管如此,上述情況仍然適用 - 也就是說,這不是直到運行時才知道類型的情況,因此使用dynamic
不是正確的方案。 由於對象的使用是短暫的,我會使用struct
。 看到這里進行深入討論時, struct
應使用: 當使用結構?
如果您選擇您提出的兩種解決方案中的任何一種,則不會對性能產生任何影響。
當編譯器遇到dynamic
關鍵字時,它將執行相同的操作,將定義一個包含所有已定義成員的類。
對於這個例子:
new { Property1 = "something", Propert2 = "somethingElse" }
編譯器將生成如下內容:
class SomeNameChoosenByCompiler
{
public string Property1 {get; set; }
public string Property2 {get; set; }
}
因為你實際上在你的方法之外使用對象,我會使用struct版本,因為它使代碼更易讀,易於理解,並且可以及時擴展。
此外,使用dynamic
您將失去編譯時的好處
你可以這樣做。
我個人的偏好是使用強類型結構,這樣如果我輸入錯誤的任何屬性名稱,我將在編譯項目時找到它。 如果您使用expandoobject,則在代碼運行之前您將無法找到。
另一件需要考慮的是struct是一個值類型,而expandoobject顯然是一個引用類型。 這可能會影響您的決定,因為這兩種類型可以在其余代碼中使用。 例如,值類型變量不能設置為null,並且它們遵循不同的復制語義。
結構類型的變量實質上是與管道膠帶粘在一起的一組變量。 結構類型的堆對象(即“盒裝”結構實例)由運行時處理,就好像它是一個類對象,該結構類型的變量作為其唯一的字段; 任何在整個結構上運行的方法都在該領域運作,而在結構領域運作的方法則在其子領域運作。
如果將變量用作組,則將變量組與管道磁帶綁定在一起的能力非常有用; 然而,幾乎所有想要這樣做的情況都要求結構至少在兩個地方使用(例如,它被復制的地方,以及它被復制到的地方),盡管有些情況下所有地方都可能被限制在單個函數中(例如,一個函數可能有變量prevState
和currentState
,每個變量包含幾個字段,並且可能希望能夠獲取currentState
中所有變量的快照,然后將所有變量恢復為其先前的值) 。 結構可能對此有利。
我建議有一個非常簡單的結構定義通常是好的。 如果有一個方法可以讀取列表並根據一些傳入的IComparer<T>
計算最小值和最大值,則具有以下結構:
struct MinMaxResult<T> { public T Minimum, Maximum; }
可以使事情比使用更復雜的數據類型更清楚,數據類型將其字段包裝在屬性中並嘗試強制執行不變量,例如Maximim >= Minimum
等MinMaxResult
是具有暴露字段的結構的事實清楚地表明給定聲明MinMaxResult mmr;
,代碼不應該指望mmr.Minimum
具有超出“寫入mmr.Minimum
的最后一個值,或者如果沒有寫入任何內容則default(T)
”之外的任何含義。 感興趣的一切都將出現在對mmr
任何寫作中; MinMaxResult<T>
定義越簡潔,它就越不會分散實際發生的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.