C#指针引用

时间:2011-05-25 23:37:47

标签: c# pointers

有没有办法在c#中创建c ++样式指针?当我不知道它是哪个int时,我需要在几个地方设置一个int 就像在c ++中一样,我会这样做:

int *i;
if(cond0) i = &someint;
if(cond1) i = &otherint;
if(cond2) i = &thirdint;

if(cond3) *i = someval;
if(cond4) *i = otherval;
if(cond5) *i = thirdval;

如果我用c#样式执行此操作,我将需要9个ifs并且我的程序有更多条件因此不可行。
我想到了一些像以下那样的价值:

int val;
if(cond3) val = someval;
if(cond4) val = otherval;
if(cond5) val = thirdval;

if(cond0) someint = val;
if(cond1) otherint = val;
if(cond2) thirdint = val;

但是这是不可能的,因为cond3,4和5分散在程​​序中。

4 个答案:

答案 0 :(得分:2)

确实如此,但您必须在unsafe block中包装任何代码。

或者,如果在方法中发生这种情况,那么您可以使用'ref' keyword通过引用传递参数。

这两个选项都限制了方法边界的解决方案。如果你正在处理比这更分散的事情,那么在C#中尝试找到重新组织代码以使用较少全局状态的方法可能会更好。

答案 1 :(得分:1)

是的,有一种名为IntPtr的类型,我用它来处理Windows句柄。

答案 2 :(得分:1)

Here's an example of C# pointers说明了他们的声明以及如何将它们包裹在unsafe block

另请参阅C# Programming Guide - Pointer Types

答案 3 :(得分:0)

我不确定您是否在问题中提供了足够的信息来给出正确答案,但一种可能的解决方案是使用ref参数在函数中设置值。

class Program
{
    static void Main(string[] args)
    {
        var i = 1;
        var someint = 2;
        var otherint = 3;
        var thirdint = 4;

        Console.WriteLine("i: {0}\nsomeint: {1}\notherint: {2}\nthirdint: {3}", i, someint, otherint, thirdint);
        SetInts(true, false, false, false, false, false, ref i, ref someint, ref otherint, ref thirdint);
        Console.WriteLine("i: {0}\nsomeint: {1}\notherint: {2}\nthirdint: {3}", i, someint, otherint, thirdint);

        Console.ReadKey();
    }

    static void SetInts(bool cond0, bool cond1, bool cond2, bool cond3, bool cond4, bool cond5, ref int i, ref int someint, ref int otherint, ref int thirdint)
    {
        if (cond0) i = someint;
        if (cond1) i = otherint;
        if (cond2) i = thirdint;

        if (cond3) i = someint;
        if (cond4) i = otherint;
        if (cond5) i = thirdint;
    }
}