2010-09-06 85 views

回答

9

號在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#中的引用是不同的 - 你不應該把它們當作指針 - 它們意圖變得更加不透明,並提供一種「引用」到變量或對象的方式,而不一定意味着它們指示它在內存中的位置。

通過引用,您可以使用特殊關鍵字(out,ref)將別名傳遞給變量。這些僅在方法調用的上下文中可用 - 編譯器可以使用關於對象生命週期的信息來確保引用不會超出原始變量的別名。

+0

我認爲這與垃圾收集器有關嗎? – 2010-09-06 18:44:12

+0

我不禁想着不可變的引用類型(字符串)不是展示'ref'參數的最佳主題。 – 2010-09-06 19:45:00

6

可以使用方法參數關鍵字ref

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

這樣調用:

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

結果:

42 

從文檔:

方法參數的ref方法參數關鍵字會導致方法引用傳入方法的相同變量。當控制回到調用方法時,對該方法中的參數所做的任何更改都會反映在該變量中。

要使用ref參數,參數必須顯式作爲ref參數傳遞給方法。 ref參數的值將被傳遞給ref參數。

1

使用ref。例如。 Foo(ref int i)將允許Foo通過引用調用者的值來更改i的值。

1

指針是正確的方式嗎?

不是在C#中它們不是。使用ref參數:

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

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

如果該值是一個類,它已經通過引用傳遞,並且不需要其他任何東西,除非需要將對象分配給某個東西,val = anotherobject,那麼您需要使用ref或out關鍵字。如果它是一個結構體(int,float,long,double等),那麼你必須使用ref(如果對象可能改變或不改變)或out(如果對象將被改變)。在由ref或val標記的方法中,可以有多個參數。