c#最佳实践中的函数重载

时间:2017-11-21 16:38:45

标签: c# arrays casting overloading

我本质上是一名VB.Net程序员,他不得不在c#中做一个小小的项目,所以请原谅我这是一个显而易见的问题!

我正在使用第三方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中执行的工作基本相同(显示文本/图形数据)并且在两个函数中实际上是代码的复制和粘贴不可能很好实践? 我意识到我可以使用Int16 []版本的WorkFunction并转换

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]); }
}

3 个答案:

答案 0 :(得分:0)

我会按照评论中的说明使用泛型,但我认为你需要一个答案才能结束你的问题。

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]); }
}

泛型将为您完成这项工作。 如果您想了解更多关于泛型的信息,请查看this

如果实施不符合目的,请告诉我们有关数据使用的更多信息。

答案 1 :(得分:0)

我经常使用的一个选项是因为它的简单性就是将“相同的代码”放在一个单独的函数中:

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.
}

它基本上是代码提取,甚至还有一些工具可以准确地为您完成。

答案 2 :(得分:0)

当c#.net中的功能相同时,重载是很好的做法。但最近几年/几个月还有一些新功能,如泛型方法,它将允许创建具有泛型参数的单个方法。所以您可以选择不创建重载但创建通用函数,这将允许所有dataype只在单个函数中

示例:

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]); 
}
}