安全(在C#意义上)用指针实现某些东西的方法

时间:2011-02-13 07:14:11

标签: c# pointers

            ...
            {
                int *r1, *r2;
                r1 = GetCorrectRegister(first);
                r2 = GetCorrectRegister(second);
                switch ((OpCode)current.opcode)
                {
                    case OpCode.ADDR:
                        r2 = r1 + r2;
                        break;
                }
            }
            ...

这是解决此问题的明显,最简单的方法。但是,如果我能避免它,我宁愿不使用不安全的方法。基本上,我有一堆代表寄存器的整数。有一些汇编指令将寄存器助记符作为参数。我不希望有逻辑来确定在switch语句的每个分支中分配哪个变量,或者使用某种类型的kludgey GetRegisterValue(助记符)和SetRegisterValue(助记符)函数。是否有一些C#方式做类似的事情?

2 个答案:

答案 0 :(得分:5)

  

我有一堆整数   代表寄存器

这里显而易见的事情是没有一堆整数。创建一个数组

 int[] registers = new int[NUMBER_OF_REGISTERS];

您的上述代码变为

    {
            int r1Index, r2Index;
            r1Index = GetCorrectRegisterIndex(first);
            r2Index = GetCorrectRegisterIndex(second);
            switch ((OpCode)current.opcode)
            {
                case OpCode.ADDR:
                    registers[r1Index] = registers[r1Index] + registers[r2Index];
                    break;
            }


     }

此外,使用enum为您的注册名称创建符号名称,其中每个名称都为您提供正确的索引。

答案 1 :(得分:1)

如何使用class和ref参数?

class Registers
{
    public int EAX;
    public int EBX;
    //...

    public void ExecuteBinaryOperation(int opCode, ref int r1, ref int r2)
    {
        // ...
        // binary operation ADD.
        r2 = r1 + r2;
        //...
    }
}

并在代码中:

registers.ExecuteBinaryOperation(0, ref registers.EAX, ref registers.EBX);