如何在多个对象之间共享一个值? C#

时间:2013-04-12 03:42:23

标签: c#

是否可以在同一个类的某些对象之间共享一些变量,以便在一个对象中更改值时,另一个对象中的值也会更改?静态变量在这种情况下不起作用,因为可能有2个对象都有一些相关变量,另外2个对象有不同的相关变量。

例如,假设我有4个正方形排列成一个大正方形,正方形坐标位于x,y,z平面。当4个方格在一起时,它们都会有一个位于最大方块中心的点。

假装这个方格也有一个z坐标。现在,正方形将共享位于中心的点。左上角正方形的右下角,右上角正方形的左下角等都将具有相同的(x,y,z)值。

现在我想要的是,如果一个方格的z值发生变化,它们都会在没有任何额外代码的情况下发生变化,就像它们都指向相同的内存位置一样,所以它们在某种意义上“自动”更新。 / p>

这样的事情可能吗?

3 个答案:

答案 0 :(得分:3)

我认为你正在以错误的方式思考这个问题。如果要将所有正方形视为逻辑上的一个对象,请创建一个封装所有正方形的对象并提供所需的逻辑。你不应该让对象偷偷地改变其背后的其他对象的价值观,IMO。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

实施可观察的模式。

查看此帖子: Super-simple example of C# observer/observable with delegates

希望它对你有所帮助。