需要帮助将此代码片段从c转换为c#

本文关键字:转换 片段 代码 帮助 | 更新日期: 2023-09-27 18:02:41

typedef struct {
    int e1;
    int e2;
    int e3;
    int e4;
    int e5;
} abc;

void Hello(abc * a, int index)
{
    int * post = (&(a->e1) + index);
    int i;
    for(i = 0; i<5; i++)
    {
        *(post + i) = i;    
    }
}
我在这里遇到的问题是它们如何通过 访问结构体中的下一个元素
*(post + i)

我不确定如何在c#中完成所有这些,而且,我不想在c#中使用不安全的指针,但它的替代。

谢谢!

需要帮助将此代码片段从c转换为c#

您应该将struct替换为包含5个元素的数组。

如果你愿意,你可以把数组包装在一个有五个属性的类中。

编辑…

当你说"Wrap"时,它通常意味着在一个类中编写属性,该属性可以设置或获取单个变量,数组元素或另一个类的成员的值,该类的实例存在于你的类中(这里通常的用法="Wrap一个对象")。对于分离关注点和连接多个对象的功能非常有用。从技术上讲,所有简单的属性都只是"包装"它们的私有成员变量。

每个注释的示例:

class test
{
    int[] e = new int[5];
    public void Hello(int index)
    {
        for (int i = 0; i <= 4; i++) {
            // will always happen if index != 0
            if (i + index > 4) {
                MsgBox("Original code would have overwritten memory. .Net will now blow up.");
            }
            e[i + index] = i;
        }
    }
    public int e1 {
        get { return e[0]; }
        set { e[0] = value; }
    }
    public int e2 {
        get { return e[1]; }
        set { e[1] = value; }
    }
    //' ETC etc etc with e3-e5 ...
}

C代码的问题是,如果index大于0,它将从abc结构体的末尾运行,从而覆盖随机内存。这就是为什么c#这种更安全的语言不允许这些事情发生的原因。我在c#中实现代码的方式是:

struct abc
{
    public int[] e;
}
void Hello(ref abc a, int index)
{
    a.e = new int[5];
    for (int i = 0;  i < 5;  ++i)
        a.e[index + i] = i;
}

请注意,如果index> 0,您将得到一个越界异常,而不是像在C代码片段中那样可能得到静默内存覆盖。

C代码背后的思想不适合c#。C代码基于这样的假设:结构体的字段将按照定义字段的顺序依次放置在内存中。上面的例子看起来既像家庭作业,也像做作的例子。如果不知道真正的意图,很难在c#中给出一个具体的例子。

这里的其他示例建议更改数据结构,但如果您不能或不想这样做,您可以将反射与struct类型的对象数组结合使用,以实现与上述相同的结果。

void Hello(abc currentObj){
  var fields = typeof(abc).GetFields();
  for(var i = 0;i<fields.Length;i++){
    fields[i].SetValue(currentObj,i);
  }
}