【问题标题】:Function overload in c# best practicesc#最佳实践中的函数重载
【发布时间】: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&lt;T&gt;(T[] data) { ... } -- 尽管取决于您对数组中的项目所做的事情,您可能不得不摆弄约束(请参阅下面的 Amy 的评论)。跨度>
  • @MikeCheel 泛型可能合适,也可能不合适。如果WorkFunction 进行算术运算,则不能使用泛型。
  • 您必须发布 WorkFunction 实际在做什么,否则我们不知道“最佳实践”是什么
  • 我也忘了 T 必须是非密封类或接口。

标签: c# arrays casting overloading


【解决方案1】:

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

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。

那么如果实施不符合目的,请告诉我们更多关于数据的使用情况。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-14
        • 2010-10-02
        • 2011-03-14
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        相关资源
        最近更新 更多