2013-08-30 31 views
0

我一直在尋找類似的方式使用預處理器創建在C別的像它可能別名(this問題有點類似,無法找到任何有用的有)。代碼片段:創建一個「別名」別的東西

這是問題:我有一個接收陣列的方法,但該陣列的每個位置都有特定的含義,就像他們在那裏有具體名稱不同的參數。我想要做的是使我的代碼更容易通過使用這些特定名稱來讀取(和寫入),但另一方面,我不想創建另一個方法調用(如示例1),也不指定數組定位到新變量(示例2),因爲性能至關重要。

實施例1:

void OriginalMethodSignature(Type[] values) 
    { 
     SimplifiedMethod(values[0], values[1], ... values[n]); 
    } 

    void SimplifiedMethod(Type specificName1, Type specificName2, ... Type specificNameN) 
    { 
     // simple implementation using specific names instead of values[n] 
    } 

實施例2:

void OriginalMethodSignature(Type[] values) 
    { 
     Type specificName1 = values[0]; 
     Type specificName2 = values[1]; 
     ... 
     Type specificNameN = values[n]; 
     // simple implementation using specific names instead of values[n] 
    } 

因爲在dellegate使用其時,Type固定我不能改變方法簽名。

下一個例子是一個好一點,但仍然不是最佳:

void OriginalMethodSignature(Type[] values) 
    { 
     // implementation using values[specificName1] ... values [specificNameN] 
    } 
    const int specificName1 = 0; 
    const int specificName2 = 1; 
    ... 
    const int specificNameN = n-1; 

有什麼方法來創建用於此目的的片段?如果是的話,它會是怎樣?

+1

你可以爲每個索引創建一個私有枚舉,然後說'values [(int)MyEnum.FirstValue]'? –

+0

是的,這比沒有更好,我想出了這個,就像我剛剛發佈的編輯。 – HericDenis

+0

不是爲了啓動一個參數,而是'Enums'就像'goto'。適用於非常特定的用例,但通常是代碼異味。 – STW

回答

3

沒有任何內置的方式做你wan't什麼,因爲你真的不應該在所有做。您應該使用具有屬性的對象而不是數組。

無論如何,你可以作出這樣的封裝陣列,從而使性能使用數組作爲存儲對象:

public class NamedObject { 

    private Type[] _values; 

    public NamedObject(Type[] values) { 
    _values = values; 
    } 

    public SpecificName1 { get { return _values[0]; } set { _values[0] = value; } } 
    public SpecificName2 { get { return _values[1]; } set { _values[1] = value; } } 
    public SpecificName3 { get { return _values[2]; } set { _values[2] = value; } } 
    public SpecificName4 { get { return _values[3]; } set { _values[3] = value; } } 
    public SpecificName5 { get { return _values[4]; } set { _values[4] = value; } } 
    public SpecificName6 { get { return _values[5]; } set { _values[5] = value; } } 

} 

現在你可以使用該對象訪問數組:

void OriginalMethodSignature(Type[] values) { 
    NamedObject obj = new NamedObject(values); 
    // get a value 
    Type x = obj.SpecificName4; 
    // set a value 
    obj.SpecificName2 = x; 
} 
+0

好了,不解決我的問題,但因爲它說「沒有任何內置的方式來做你想做的事」 - 這是正確的答案 – HericDenis

2

創建一個專用classstruct,並解析陣列進去。

public class MyClassOfStuff 
{ 
    Type SpecificName1 {get;set;} 

    Type SpecificName2 {get;set;} 

    public static MyClassOfStuff Parse(Type[] value) 
    { 
     Type specificName1 = values[0]; 
     Type specificName2 = values[1]; 
     ... 
     Type specificNameN = values[n]; 
    } 
} 

void OriginalMethodSignature(Type[] values) 
{ 
    var mystuff = MyClassOfStuff.Parse(values); 
} 
+0

當然有效,但會影響性能,這就是我避免......我正在尋找一些處理器時間重命名(我不知道我是否是足夠明確的,不是我的母語) – HericDenis

+0

當你「再在.NET你的大腦需要停止思考關於C編碼 - 它足夠快:) – STW

+0

我部分同意@STW,我通常認爲,當我只需要明確的良好閱讀的代碼,但在這具體情況表現真正的關鍵,這是一個優化的數值計算方法,我想我會爲枚舉或常量的定義,將是一個更快的和還是有點高興讀 – HericDenis