2015-04-01 41 views
2

我有一個問題是引用列表中的一個目標丟失,這就是我闡述我的代碼:參考跟不上

PropertyObject[] myProperties = new PropertyObject[200]; 
var objParent = new Parent(); 
var objProperty = new PropertyObject(); 

myProperties[0] = objProperty; 
objParent.property = myProperties[0]; 

現在,當我修改objParent.property它不修改myProperties數組中的對象,任何解決方法?我需要這個,所以我不必遍歷數組。

我這是怎麼修改的對象:

public void modifyObject(ref Parent objectToModify) { 
    objectToModify.property.isThisCrazy = true; 
} 

然後我調用modifyObject方法。

+0

什麼是'PropertyObject'? – haim770 2015-04-01 07:51:41

+0

它是一個結構來保存對象的一些特徵 – 2015-04-01 07:52:20

+0

'objParent'不在數組中,那麼如果修改'objParent',爲什麼數組會改變呢? _「然後我只調用modifyObject函數」_ Where? – 2015-04-01 07:52:51

回答

4

struct s意思是不可變的。將struct指定給另一個變量將導致struct被複制。

在一個實例上分配屬性時,struct的其他實例的屬性不會更改。因此,您不會在其他參考資料中看到更新。

示例代碼演示問題結構:

struct X 
{ 
    public string Y { get; set; } 

    public X(string y) : this() 
    { 
     Y = y; 
    } 
} 

X x = new X("abc"); 
X x2 = x; 

x2.Y = "def"; 

Console.WriteLine(x.Y); 
Console.WriteLine(x2.Y); 

帶班您預期的效果x.Yx2.Y是相同的,但與結構。

+0

哇這是啓發性的謝謝 – 2015-04-01 07:55:32

+3

結構本質上不是不可變的。他們的複製語義使可變結構難以使用。因此,它是不可改變的,但建議可變結構是非常可能的。 – 2015-04-01 07:58:47

+0

@ mikez:同意。稍微更新第一句。 – 2015-04-01 07:59:25

2

您發現「對象的引用」丟失,但struct對它沒有「引用」。

A struct具有值型語義。因此,當您使用=進行分配時,會生成右側的副本。你這樣做:

myProperties[0] = objProperty; 

副本的價值,並把數組的第0個條目中的副本。

如果您以後修改「原始」實例objProperty,則該更改將不會出現在陣列中的副本中。

這不是一個真正的數組問題。所有struct值的分配都會發生同樣的情況。例如:

var objProperty2 = objProperty; 

如果原始objProperty是繼突變,複製的價值objProperty2將不受影響。例如參見C# Reference type assignment VS value type assignment

有人認爲可變結構是邪惡的。