如何阻止类引用自己的类?

时间:2013-05-09 22:52:25

标签: c# class reference copy

如何阻止隐式引用自己类的类?

示例:

class foo
{
    public foo(int y)
    {
        x = y;
    }
    public int x;
}
class program
{
    static void Main()
    {
        foo myFoo1 = new foo(10);
        foo myFoo2 = myFoo1; //How do i prevent this?
        Console.Read();
    }
}

3 个答案:

答案 0 :(得分:4)

你无法阻止这一点。 myFoo1的类型为foo,因此可以将其分配到myFoo2,期间。

无论如何,目前尚不清楚你认为通过防止这种情况可以获得什么。由于foo是引用类型(class),因此分配的结果是,之前您只有一个名称可用于引用您创建的foo对象,有两个。由于名称只是为了开发人员的方便,因此程序的行为没有区别。赋值不会创建另一个对象。

请注意,如果foo是值类型(struct),则分配将生成值的副本; myFoo1myFoo2完全相互独立。

答案 1 :(得分:1)

您无法以这种方式限制变量。 X 类型的变量可以引用 X 类型的对象的任何实例(对于类)/可以分配类型 X 的任何有效值(对于结构)。

你唯一能做的就是使foo成为一个结构,因为结构的赋值会产生该结构的一个新的副本。例如:

struct foo
{
    public int x;

    public foo(int y)
    {
        x = y;
    }
}

static void Main()
{
    foo myFoo1 = new foo(10);
    foo myFoo2 = myFoo1;
    myFoo2.x = 5;
    Console.WriteLine(myFoo1.x); // 10
}

答案 2 :(得分:1)

简而言之,您对您认为发生的事情(或至少是措辞)感到困惑。

在C#中,内存中有对象,以及对这些对象的引用。当你这样做

foo myFoo1 = new foo(10);

myFoo1是一个引用,引用的值是内存中存储foo类型对象的位置。

当你这样做时

foo myFoo2 = myFoo1;

myFoo2是一个引用,引用的值是内存中存储foo类型对象的位置 - 完全相同的对象。两个引用都做了相同的事情,无法区分。

myFoo2myFoo1正在做相同的事情,那么如何在允许另一个的同时阻止一个呢?

如果您的意思是“我如何防止两个变量引用同一个对象?”#39根据您的意思,有两种解决方案:

  1. 如果问题是你有两个引用同一个对象的变量,一个变量会改变对象,而另一个变量会意外地改变对象'看到变化,使对象不可变和突变'对象实际上返回一个新的,不可变的对象,并进行了更改。

  2. 您可以将对象设为结构。结构由值引用,而不是通过引用引用,因此当您创建一个变量时,指向'对于另一个变量的结构,它将整个结构复制到新变量中,而不是复制引用。