2013-04-12 102 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

相关问题