从VBA到c#的转换(最佳实践)

本文关键字:最佳 转换 VBA | 更新日期: 2023-09-27 18:07:04

我已经将大约4000-5000行代码从VBA转换为c#。我唯一的问题是:


在VBA中,您可以创建一个类型的数组,也可以设置开始索引。例如:

//This creates an Array with an index 5 to index 100.
doubleArray(5 To 100) As Double

在c#中不可能创建索引不是0的数组。(请看下面的链接。)在我看来,这将留下以下两种可能性:

1。创建一个从0到100的doubleArray

我可以这样创建一个doubleray:

Double[] doubleArray = new Double[100];

这有一个优点,我可以使用VBA代码中描述的索引号来设置索引。这意味着:VBA代码假设数组从[5]到[100]存在,并且我也能够在c#中设置数字5到100。

在我看来,然而,这是相当混乱的,因为你总是创建数组与未使用的内存(在这种情况下,索引[0]到索引[4])。正因为如此,我在考虑第二个选择。

2。创建一个从0到((topindex - bottomindex) + 1)的doubleArray

我可以这样创建一个doubleray:

Double[] doubleArray = new Double[((topindex - bottomindex) + 1)];

在我看来,这应该是"最干净"的方式来克服这个问题,没有不必要的内存使用。在VBA中,数组使用[5]到[100],这使得长度为96。对于这个选项((100 - 5)+ 1)= 96)也是如此。

然而,最大的缺点是,这也需要忽略所有已经编写的代码。如果任何函数调用了doubleArray[97],它应该是doubleArray[((97 - 5) + 1)]。


因此,我的问题是,如何处理这种情况?

如果有人看到其他选择/可能性,欢迎提出建议。


查看更多背景信息。我之前的问题是:Vba类型语句到c#的转换

从VBA到c#的转换(最佳实践)

三步走:

  1. 为VBA中每个数组实例的创建单元测试。

  2. 将所有VBA数组调整为基于零,检查是否符合单元测试。

  3. c#端口

我希望避免引入跨语言边界的错误,因为调和问题更加困难。

我选择#2,但这里是我为你想到的另一个解决方案。

你也可以做一个自定义类,里面只有一个数组。您将执行3个方法:

    (myObject.setElement(6,0.12))
  1. 获取一个元素(myObject.getElement(6))
  2. 第一个设置数组的大小(myObject.setSize(5100))

实际上,当你要获取或设置元素时,你会去索引(index-5)

你可以做的类的例子

    public class CustomArray {
      private Double[] myArray;
      private int spread;
      public CustomArray(){
        setSize(5,100);
      }
      public void setSize (int lowerIndex, int upperIndex){
        myArray = new Double[(upperIndex-lowerIndex)+1]
        spread = lowerIndex
      }
      public Double getElement(int index){
        return myArray[index-spread];
      }
      public void setElement(int index, Double element){
        myArray[index-spread] = element;
      }
    }

(PS:我已经有一年没有用c#编程了,所以可能会有一些语法错误,但代码是为了更好地理解)