繁体   English   中英

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

[英]Need help converting this snippet from c to c#

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# 中使用不安全的指针,但可以替代它。

谢谢!

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

如果需要,可以将数组包装在具有五个属性的 class 中。

编辑...

当您说“包装”时,它通常意味着在 class 中写入属性,这些属性设置或获取单个变量、数组元素或另一个 class 的成员的值,该 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 的实例位于您的 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 '包装一个对象')。 对于分离关注点和连接多个对象的功能非常有用。 从技术上讲,所有简单的属性都只是“包装”它们的私有成员变量。

每个评论的示例:

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 结构的末尾,从而覆盖随机 memory。 这就是为什么 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 代码段中那样可能无声的 memory 覆盖。

C 代码背后的想法不适合 C#。 C 代码是基于这样的假设,即结构的字段将按照定义字段的顺序依次放置在 memory 中。上面看起来像是作业或人为的示例。 在不了解真实意图的情况下,很难在 C# 中给出具体示例。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM