我本质上是一名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]); }
}
答案 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]);
}
}