1

How do i prevent making a class implicitly referencing to its own class?

example:

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();
    }
}
4

3 回答 3

4

你无法阻止这一点。myFoo1是 类型的foo,所以它可以被分配到myFoo2,期间。

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

请注意,如果foo是值类型 (a struct),则赋值将复制该值;myFoo1并且myFoo2彼此完全独立。

于 2013-05-09T22:54:14.833 回答
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
}
于 2013-05-09T22:55:41.893 回答
1

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

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

foo myFoo1 = new foo(10);

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

当你这样做

foo myFoo2 = myFoo1;

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

myFoo2并且myFoo1正在做同样的事情,那么你怎么能在允许另一个的同时阻止一个呢?

如果您的意思是“如何防止两个变量引用同一个对象?” 有两种解决方案,具体取决于您的意思:

  1. 如果问题是您有两个变量引用同一个对象,一个变量使对象发生变异,而另一个变量“意外”看到更改,则使对象不可变,对象的“变异”实际上返回一个新的、不可变的对象所做的更改。

  2. 您可以使对象成为结构。结构是按值引用的,而不是按引用,因此当您使一个变量“指向”另一个变量的结构时,它会将整个结构复制到新变量中,而不是复制引用。

于 2013-05-09T22:55:48.587 回答