方法参数中的C#指针?

时间:2010-09-06 18:29:17

标签: c# variables pointers methods

我希望从内部直接修改方法之外的变量值 指针就是这样,对吗?

如何?

5 个答案:

答案 0 :(得分:13)

否。在c#中,您可以使用refout修饰符来应用传递引用语义:

void Foo( ref string s, ref int x )
{
    s = "Hello World"; // caller sees the change to s
    x = 100;           // caller sees the change to x
}

// or, alternatively...

void Bar( out string s )
{
    s = "Hello World"; 
}

这两者之间的区别在于,使用out时,调用者在调用方法时不必指定值,因为要求被调用的方法在退出之前指定一个值。

在C#中,“指针”只能在unsafe code中使用。与在C或C ++中一样,C#中的指针允许您引用变量或对象的位置。 C#中的引用是不同的 - 您不应该将它们视为指针 - 它们旨在更加不透明,并提供一种“引用”变量或对象的方式,而不必暗示它们在内存中指示它的位置。

通过引用,您可以使用特殊关键字(outref)将别名传递给变量。这些只在方法调用的上下文中可用 - 编译器可以使用有关对象的生命周期的信息来确保引用不会超过原始变量的别名。

答案 1 :(得分:8)

您可以使用方法参数关键字ref

void modifyFoo(ref int foo)
{
    foo = 42;
}

这样打电话:

int myFoo = 0;
modifyFoo(ref myFoo);
Console.WriteLine(myFoo);

结果:

42

来自文档:

  

方法参数上的ref方法参数关键字使方法引用传递给方法的同一变量。当控制传递回调用方法时,对方法中的参数所做的任何更改都将反映在该变量中。

     

要使用ref参数,必须将参数显式作为ref参数传递给方法。 ref参数的值将传递给ref参数。

答案 2 :(得分:1)

使用ref。例如。 Foo(ref int i)允许Foo通过对调用方值的引用来更改i的值。

答案 3 :(得分:1)

  

指针就是这样,对吗?

不在C#,他们不是。使用ref参数:

 void Times2(ref int a) { a = a * 2; }

 void Foo()
 {
      int x = 1;
      Times2(ref x);
      // x is now 2 
 }

答案 4 :(得分:0)

如果值是一个类,而不是它已经通过引用传递,除了你需要将对象分配给某个东西val = anotherobject,那么你需要使用ref或out关键字。 。

如果它是一个struct(int,float,long,double等),那么你必须使用ref(如果对象可能会或可能不会被更改)或out(如果对象将被更改)。您可以在由ref或val标记的方法中包含多个参数。