簡體   English   中英

我應該為一個函數唯一的目的定義一個結構嗎?

[英]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;
}

注意:

  1. 雖然我可以在結構中定義所有可能的道具,但我不知道我需要使用多少道具。

  2. 示例並不真實,它只顯示了兩種可能的方法。

這不是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,並且它們遵循不同的復制語義。

結構類型的變量實質上是與管道膠帶粘在一起的一組變量。 結構類型的堆對象(即“盒裝”結構實例)由運行時處理,就好像它是一個類對象,該結構類型的變量作為其唯一的字段; 任何在整個結構上運行的方法都在該領域運作,而在結構領域運作的方法則在其子領域運作。

如果將變量用作組,則將變量組與管道磁帶綁定在一起的能力非常有用; 然而,幾乎所有想要這樣做的情況都要求結構至少在兩個地方使用(例如,它被復制的地方,以及它被復制到的地方),盡管有些情況下所有地方都可能被限制在單個函數中(例如,一個函數可能有變量prevStatecurrentState ,每個變量包含幾個字段,並且可能希望能夠獲取currentState中所有變量的快照,然后將所有變量恢復為其先前的值) 。 結構可能對此有利。

我建議有一個非常簡單的結構定義通常是好的。 如果有一個方法可以讀取列表並根據一些傳入的IComparer<T>計算最小值和最大值,則具有以下結構:

struct MinMaxResult<T> { public T Minimum, Maximum; } 

可以使事情比使用更復雜的數據類型更清楚,數據類型將其字段包裝在屬性中並嘗試強制執行不變量,例如Maximim >= MinimumMinMaxResult是具有暴露字段的結構的事實清楚地表明給定聲明MinMaxResult mmr; ,代碼不應該指望mmr.Minimum具有超出“寫入mmr.Minimum的最后一個值,或者如果沒有寫入任何內容則default(T) ”之外的任何含義。 感興趣的一切都將出現在對mmr任何寫作中; MinMaxResult<T>定義越簡潔,它就越不會分散實際發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM