簡體   English   中英

C#最佳實踐中的函數重載

[英]Function overload in c# best practices

我本質上是VB.Net程序員,他必須使用c#進行一個小型輔助項目,所以如果這是一個明顯的問題,請原諒我!

我正在使用第三方API,該API返回數組中的數據,為此,我必須先查詢數據類型,然后再獲取數據,然后將正確數據類型的數組傳遞給API,以便正確打包數據:例如

// Get info
Int32 dataLength = MyAPI.GetDataLength();
Int32 dataDepth = MyAPI.GetDataDepth();

//And get the data.
switch (dataDepth)
{
    case 8:
        byte[] bData = new byte[dataLength];
        MyAPI.GetData(bData);

        //Do Work
        WorkFunction(bData);
        break;

    case 16:
        Int16[] iData = new Int16[dataLength];
        MyAPI.GetData(iData);

        //Do Work
        WorkFunction(iData);
        break;
    }

這可以正常工作,並且可以正確地填充字節數組或Int16數組。 目前,我有一個WorkFunction的重載,如下所示:

void WorkFunction(byte[] data){
    //Do Stuff

}


void WorkFunction(Int16[] data){
    //Do Stuff

}

很好,所有工作都可以-但在WorkFunction中執行的工作本質上是相同的(顯示文本/圖形數據),並且在兩個函數中實質上具有代碼的復制粘貼功能不是一個好習慣嗎? 我意識到我可以擁有WorkFunction的Int16 []版本並進行轉換

int[] bytesAsInts = yourBytes.Select(x => (int)x).ToArray();

但是數據是從硬件設備輸入的,除非實際需要,否則我不願意添加其他“工作”。

您認為什么是“最佳實踐”?

謝謝。


到目前為止,感謝您的評論。 WorkFunction非常簡單。 它正在更新一些標簽,並在圖形上繪制一些點。 有幾個額外的參數,但是它們是固定數據類型的:

void WorkFunction(Int16[] data, double aValue){
    //Do Stuff
    MyTextBox.text = aValue.ToString("0.00");

    MyChartSeries.Points.Clear();
    for (int i = 0; i < data.Length; i++) { 
        MyChartSeries.Points.AddXY(i, data[i]); }
}

我將按照評論中的說明使用泛型,但我認為您需要一個答案才能結束問題。

void WorkFunction<DType>(DType[] data, double aValue){
    //Do Stuff
    MyTextBox.text = aValue.ToString("0.00");

    MyChartSeries.Points.Clear();
    for (int i = 0; i < data.Length; i++) { 
        MyChartSeries.Points.AddXY(i, data[i]); }
}

泛型將為您完成這項工作。 如果您想以更熟悉的語言來了解有關泛型的更多信息,請選中

然后,如果實現不符合目的,請告訴我們更多有關數據使用的信息。

由於其簡單性,我經常使用的一個選項是將“相同的代碼”放在單獨的函數中:

void WorkFunction(byte[] data){

    int[] bytesAsInts = data.Select(x => (int)x).ToArray();

    DoStuff(bytesAsInts);
}


void WorkFunction(Int16[] data){
    DoStuff(data);

}

public void DoStuff(int16[] dataFromBoth)
{ 
    // here is where you do stuff, whatever it came from.
}

它基本上是代碼提取,甚至還有一些工具可以為您准確地完成代碼提取。

當c#.net中的功能相同時,重載是一個好習慣。 但最近幾年/幾個月來,還提供了一些新功能,例如通用方法,可以使用通用參數創建單個方法。 因此,您可以選擇不創建重載,而是創建通用函數,該函數將僅允許單個函數中的所有數據類型

例:

void WorkFunction<Datatype>(Datatype[] data, double aValue){
    //Do Stuff
    MyTextBox.text = aValue.ToString("0.00");

    MyChartSeries.Points.Clear();
    for (int i = 0; i < data.Length; i++) { 
        MyChartSeries.Points.AddXY(i, data[i]); 
}
}

暫無
暫無

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

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