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#中使用不安全的指针,但是它可以替代它。
谢谢!
答案 0 :(得分:3)
您应该将struct
替换为5个元素的数组。
如果需要,可以将数组包装在具有五个属性的类中。
当你说'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 ...
}
答案 1 :(得分:2)
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;
}
请注意,如果索引&gt; 0,你将获得一个越界异常而不是像C片段中那样可能的静默内存覆盖。
答案 2 :(得分:1)
C代码背后的想法是不适合C#。 C代码基于这样的假设:结构的字段将按照定义字段的顺序按顺序放置在内存中。 以上看起来像是家庭作业或人为的例子。如果不知道真正的意图,很难在C#中给出一个具体的例子。
此处的其他示例建议更改数据结构,但如果您不能/不想这样做,则可以使用反射结合结构类型的对象数组来实现与上面相同的结果。
void Hello(abc currentObj){
var fields = typeof(abc).GetFields();
for(var i = 0;i<fields.Length;i++){
fields[i].SetValue(currentObj,i);
}
}