2011-10-21 124 views
4

例如:C#引用賦值運算符?

 int x = 1; 
     int y = x; 
     y = 3; 
     Debug.WriteLine(x.ToString()); 

它是否是任何參考操作員而不是 「=」 就行:3, 使在x等於3,如果我分配Y = 3。

+0

不,沒有。這已經出現了,我記得Eric Lippert很好的迴應。 – 2011-10-21 03:55:45

+3

你能解釋爲什麼你會想要那樣的東西嗎?值類型不能這樣做。 –

+0

http://stackoverflow.com/questions/1420186/references-to-variables-in-c – 2011-10-21 04:02:43

回答

4

「廉政」是分配的值類型,所以複製的價值,因爲你已經發現。

你可以通過使用「不安全」的塊使用指針在傳統的C/C++感但隨後的指針是僅該塊限制了它的使用內部使用。相反,如果您想訪問「不安全」塊之外的值,則需要轉換爲使用引用。

事情是這樣的......

var x = new Tuple<int>(1); 
var y = x; 
y.Item1 = 3; 
+0

請注意,如果x原本是一個類中的字段,則此解決方案可能不實際。在這種情況下,你可以改爲使用[this code](http://stackoverflow.com/questions/2980463/how-do-i-assign-by-reference-to-a-class-field-in-c/ 2982037#2982037)由Eric Lippert在回答類似問題時提供。 – Brian

+0

注意:'x'和'y'可以是參考類型的局部變量,同樣的道理適用。 *重新分配y不會影響x。*關於值類型的位不重要。 –

0

做到這一點的唯一方法是用「不安全」的代碼,而實際使用指針。指針不能存在於C#中不安全的代碼塊之外。然後,您應該能夠像在C/C++中一樣使用指針

查看this頁面瞭解如何使用「不安全」的代碼塊。

3

這不正是你問什麼,但我想這可能是有益的。如果你想在函數內部的指針別名,你可以使用ref關鍵字像這樣:

public static void RefExample(ref int y) 
{ 
    y = 3; 
} 

main() 
{ 
    int x = 5; 
    RefExample(ref x); 
    Console.WriteLine(x); // prints 3 
} 
3

您可以使用指針像Ç

int x = 1; 
    unsafe 
    { 
     int* y = &x; 
     *y = 3; 
    } 

    Debug.WriteLine(x.ToString()); 

(請注意,您必須用編譯不安全的標誌)

9

我曾經寫過一個原型的C#的版本有這樣的功能;你可以說:

int x = 123; 
ref int y = ref x; 

現在x和y是同一個變量的別名。

我們決定不添加該功能的語言;如果你有一個非常棒的使用案例,我很樂意聽到它。

你不是第一個人問這個功能;有關更多詳細信息,請參閱Can I use a reference inside a C# function like C++?

UPDATE:該功能可能會在C#7

+0

下面是一個例子,能夠讓'x'在循環之外成爲'i'或'j'會更好。 http://i.imgur.com/W12AMCN.png – shinzou

+0

尋找_exact_相同的功能,我發現這個問題(其中許多人都一樣)。我有一種我認爲非常普通的情況,但我無法看到使用引用的體面解決方法。我想要的不涉及指針,內存地址或C++的其他「複雜」特性。我需要一個簡單的(「盲」)引用(別名),來自C++的#define方向。我沒有興趣將函數傳遞給/從函數返回,所以也沒有與棧相關的問題。以我的情況爲例: – mireazma

+0

情況:我有幾個_int_變量,並且按下一個鍵(在一個循環中),我從現在開始「分配」一個變量作爲工作變量。現在所有要遵循的工作(許多功能)必須位於該特定變量上(即按另一個鍵來讀/寫它)。我看不到如何避免_unnecessary/overhead_code。 C++參考是絕對完美的。除了恕我直言,就像允許爲ref類型傳遞值一樣,相反也應該如此。 – mireazma

0

我想評論埃裏克利珀的答案,但新用戶不能評論的帖子。所以,我覺得我有這樣的用法。

看看這個代碼:

private void SetGridColumns(ref RegistryKey targetKey, List<ColInfo> cols) 
    { 
     string targetKeyName = Path.GetFileName(targetKey.Name); 
     m_grids.DeleteSubKeyTree(targetKeyName, false); 
     targetKey.Close(); 
     targetKey = m_grids.CreateSubKey(targetKeyName); 

// ... }

public void SetColumns(List<ColInfo> cols, bool youth) 
    { 
     RegistryKey key = youth ? m_youthGrid : m_mainGrid; 
     SetGridColumns(ref key, cols); 
    } 

它應該這樣: 在SetColumns我打電話取決於與鍵SetGridColumns「青春「參數。我希望我的密鑰首先被刪除然後重新創建。 m_mainGrid當然是一個類的成員。 在這種情況下,密鑰確實被刪除並重新創建。但重新創建的只是SetGridColumns中的「targetKey」,而不是我的m_mainGrid。

因此,我唯一能做的就是在C#中使用不是首選的指針。 如果我只能這樣做:

ref RegistryKey key = youth ? m_youthGrid : m_mainGrid; 

一切都應該正常工作。