2009-08-03 13 views
2

我知道一個令人困惑的標題。讓我解釋。將一大堆代碼放在包裝PInvoke內容的屬性的get函數中是否是不好的做法?

我必須編組一個結構數組,然後轉換爲一個類的數組(傳統兼容性)。例如

public class InnerClass {} 

public class OuterClass { private InnerClass[] innerClasses; } 


public struct InnerStruct { 
    // Data 
} 

private static buildInnerClass(InnerStruct i); 

public struct OuterStruct { 
    private int _numInnerStructs; 
    private IntPtr _innerStructs; 
    // Other members 

    public InnerClass[] InnerClasses { 
     get { 
      InnerClass[] ret = new InnerClass[_numInnerStructs]; 

      var structSize = Marshal.SizeOf(typeof(InnerStruct)); 
      var ptr = _innerStructs; 

      for (int i = 0; i < _numInnerStructs; i++) 
      { 
       InnerStruct innerStruct = (InnerStruct)Marshal.PtrToStructure(
              ptr, typeof(InnerStruct)); 
       ret[i] = buildInnerClass(innerStruct); 
       ptr = (IntPtr)((int)ptr + structSize); 
      } 
      return ret; 
     } 
    } 

} 

回答

5

在真空中觀察,這種做法沒有任何內在錯誤。但是,你應該在小心...

  1. 物業干將應該 - 很少(如果有的話)例外 - 不「貴」(即,不應該消耗大量的CPU週期或資源來執行)
  2. 屬性獲取者不應該引起副作用。例如,如果您的PInvoke代碼獲得某種新的句柄,那麼它應該是一個函數,而不是一個getter。

一般來說,請記住,屬性的編寫方式應使消費者不應該有太多(如果有的話)緩存值與再次調用屬性的理由。如果一個負責任的開發人員可以跟隨你的財產採取這種做法,那麼你就走在正確的軌道上。

1

把代碼放到PInvoke結構體中比放在普通結構體中更糟糕。爲了PInvoke的目的,只考慮struct的字段,因此你的屬性代碼不會起作用。只有當你的代碼訪問那個特定的屬性時它纔會相關。

+0

我意識到這會工作,我只是想知道如果這是好的慣用和編碼明智? – DevDevDev 2009-08-03 18:57:56

4

財產的吸氣應儘可能最小。就你而言,使用常規方法可能會更好。特別是因爲從屬性返回一個數組也是一個壞主意。

相關問題