2017-02-13 125 views
-1

我在這裏有點困惑。使用結構體時,我不能直接更改其字段,因爲整個結構體都是值類型的。 但是值類型字段的類呢?如果我有一個公共字段int X,我可以正確修改它。因此,其領域的價值型性質的唯一表現就是,當作爲一個論點獲得通過時,它是一個副本?值類型字段是引用類型?

編輯:另外

Class A 
{ 
    int B=100; //this is a field, so reference type. But it is a value type. 
} 

的地址B的內容被存儲在堆上,但被存儲在堆棧中B的值?

+2

問題不是100%清楚。你能提供代碼示例,以便我們更好地理解? – peval27

+0

是什麼讓你認爲所有的字段都是引用類型? – Servy

回答

1

有了結構,我不能直接改變它的字段,因爲整個結構都是值類型的。

當C#爲您製作struct的副本時,您無法更改情況中的字段。在其他情況下,您可以修改struct的字段。這裏是差的小規模示威:

struct Foo { 
    public int A {get;set;} 
    public void SetA(int a) { 
     A = a; 
    } 
} 

class Bar { 
    Foo f; 
    public Foo F { 
     get{return f;} 
     set {f = value;} 
    } 
    public void SetFooA(int x) { 
     f.SetA(x); 
    } 
} 

public static void Main() { 
    Bar b = new Bar(); 
    b.F.SetA(123); // b.F makes a copy, so changing A fails 
    Console.WriteLine("{0}", b.F.A); 
    b.SetFooA(456); // Inside Bar, f.SetA is called directly, so the change works fine 
    Console.WriteLine("{0}", b.F.A); 
    b.F = new Foo { A = 112233 }; // This also works, because the whole F is assigned 
    Console.WriteLine("{0}", b.F.A); 
} 

如果我有一個公共領域int X,我可以適當修改。

同樣的規則適用於用戶定義的struct s,只要你修改它的全部。你不能修改int的一部分,因爲它不是一個組合。當您一次分配整個struct時,struct的修改可以正常工作。換句話說,分配

b.F = new Foo { A = 112233 }; 
在我的例子

替換你的榜樣分配

B = 100; 

Demo.

-1

結構爲您提供了原始字段的副本,因爲結構的副本將被傳遞。將其更改爲類將傳遞該類的引用,因此如果要更改該字段,則該字段將進行修改。

0

B的內容地址存儲在堆中,但是存儲在堆棧中的B的值是多少?

否。類的值類型字段存儲在堆中。

請參考@Marc Gravell的答案在這裏,瞭解更多有關這一點:

Why value-types are stored onto Stacks?

你也可以閱讀關於這個問題@Eric Lippert的博客文章:https://blogs.msdn.microsoft.com/ericlippert/2010/09/30/the-truth-about-value-types/

總之值類型可以將存儲在堆棧上,但它們並不總是存儲在堆棧上。