【发布时间】:2017-11-21 16:38:44
【问题描述】:
我本质上是一个 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();
但数据是从硬件设备输入的,除非确实需要,否则我不愿意投入额外的“工作”。
你认为什么是“最佳实践”??
谢谢。
到目前为止,感谢 cmets。 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]); }
}
【问题讨论】:
-
为什么不使用泛型?
-
澄清 Mike 的评论:
void WorkFunction<T>(T[] data) { ... }-- 尽管取决于您对数组中的项目所做的事情,您可能不得不摆弄约束(请参阅下面的 Amy 的评论)。跨度> -
@MikeCheel 泛型可能合适,也可能不合适。如果
WorkFunction进行算术运算,则不能使用泛型。 -
您必须发布
WorkFunction实际在做什么,否则我们不知道“最佳实践”是什么 -
我也忘了 T 必须是非密封类或接口。
标签: c# arrays casting overloading