2013-04-12 162 views
1

是否有可能在同一類的某些對象之間共享某些變量,以便在一個對象中更改該值時,它也會在另一個對象中更改?在這種情況下,靜態變量不起作用,因爲可能有2個對象都具有一些相關變量,另外2個對象具有不同的相關變量。如何在多個對象之間共享一個值? C#

例如,假設我有4個正方形排列成一個大方形,而正方形座標位於x,y,z平面上。當4個方格在一起時,他們都有一個位於最大方格中心的點。

假裝這個廣場也有Z座標。現在,廣場將全部分享位於中心的點。左上角正方形的右下角,右上角正方形的左下角等將具有相同的(x,y,z)值。

現在我想要的是,如果一個正方形的z值發生變化,它們都會在沒有任何額外的代碼的情況下發生變化,就像它們都指向相同的內存位置一樣,所以它們會在某種意義上「自動」更新。

是這樣的可能嗎?

+0

如果變量是引用類型,並且變量的每個實例指向相同的引用? [MSDN傳遞引用類型參數](http://msdn.microsoft.com/en-us/library/0f66670z(v = vs.71).aspx#vclrfpassingmethodparameters_referencetypes) – JakeP

+0

它看起來不像是我之後,因爲值必須指向整個程序中相同的內存位置,而不僅僅是調用某個方法時。另外,在改變之前,每個對象都必須指向內存位置。 – Colton

回答

3

以下是您可以執行此操作的一種方法。每個方塊的數據屬性指向相同的參考。

class Square 
{ 
    private SharedData Data; 

    public Square(SharedData data) 
    { 
     this.Data = data; 
    } 
} 

class SharedData 
{ 
    public double Z { get; set; } 
} 

SharedData data = new SharedData() { Z = 100.0 } 

Square topLeft = new Square(data); 
Square topRight = new Square(data); 
Square bottomLeft = new Square(data); 
Square bottomRight = new Square(data); 

你可以把SharedData如果你希望提供只讀的平方訪問的接口後面。如果方格不應該修改Z的值,這將是一個更安全的方法。

interface IReadOnlyData 
{ 
    double GetZ(); 
} 

class SharedData : IReadOnlyData 
{ 
    public double Z { get; set; } 
    IReadOnlyData.GetZ() { return Z; } 
} 

class Square 
{ 
    private IReadOnlyData Data; 

    public Square(IReadOnlyData data) 
    { 
     this.Data = data; 
    } 
} 
+0

好吧...讓我們說我有這個實施。那麼,如果我改變了任何持有相同共享數據的正方形的Z值,那麼其他對象SharedData對象是否也會自動改變? – Colton

+1

是的,這是正確的。 C#通過引用傳遞所有類,這意味着每個方塊都接收完全相同對象的內存地址(即使實際內存地址由引用封裝)。如果更改該內存塊中保存的數據,則指向同一內存的所有其他方塊都將看到更新後的值。值得注意的是,如果廣場在單獨的線程上運行,您將不得不使用鎖定或其他同步技術來避免數據損壞。 – Despertar

+0

好吧,那回答我的問題!現在我需要嘗試一下,看看它是否會像我所希望的那樣幫助我:p。如果一切順利,它應該節省一點內存和速度。謝謝! – Colton

3

我認爲你正在考慮錯誤的方式。如果所有的方塊都被視爲邏輯上的一個對象,則使一個對象封裝所有的方塊並提供所需的邏輯。你不應該有物體偷偷摸摸地將其他物體的背後的價值變異,IMO。

+0

是的,我可以看到這是如何工作的,但是,除了座標外,每個方格也都有自己的屬性,並且實現這種方法會變得更加複雜。當然,我可以通過這種方式來完成,但這會更困難。所以原來的問題仍然存在,是否可能。 – Colton

+0

@Colton你的封裝對象可以有一個'ArrayList ',當你在封裝上調用方法時,它會正確地改變所有'Square's。 – Patashu

+0

這個問題將跟蹤哪些方塊與其他方塊相關。它可以完成,但它會變得混亂。 – Colton

1

實現可觀察模式。

檢查這個帖子: Super-simple example of C# observer/observable with delegates

希望它可以幫助你。

+0

如果我正確理解它,這些值可能會與事件處理程序綁定在一起,但是每個值仍然需要多次更新,而不是一次。 +1,因爲它會起作用! – Colton

+0

如果您對設計模式不熟悉,請快速瀏覽它的維基百科頁面。它會帶領你開始一個好的開始。 如果你碰巧遇到過很多開發者的情況,這通常是最好的選擇。 – WebDever

相關問題