如何阻止隐式引用自己类的类?
示例:
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();
}
}
答案 0 :(得分:4)
你无法阻止这一点。 myFoo1
的类型为foo
,因此可以将其分配到myFoo2
,期间。
无论如何,目前尚不清楚你认为通过防止这种情况可以获得什么。由于foo
是引用类型(class
),因此分配的结果是,之前您只有一个名称可用于引用您创建的foo
对象,有两个。由于名称只是为了开发人员的方便,因此程序的行为没有区别。赋值不会创建另一个对象。
请注意,如果foo
是值类型(struct
),则分配将生成值的副本; myFoo1
和myFoo2
完全相互独立。
答案 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
类型对象的位置 - 完全相同的对象。两个引用都做了相同的事情,无法区分。
myFoo2
和myFoo1
正在做相同的事情,那么如何在允许另一个的同时阻止一个呢?
如果您的意思是“我如何防止两个变量引用同一个对象?”#39根据您的意思,有两种解决方案:
如果问题是你有两个引用同一个对象的变量,一个变量会改变对象,而另一个变量会意外地改变对象'看到变化,使对象不可变和突变'对象实际上返回一个新的,不可变的对象,并进行了更改。
您可以将对象设为结构。结构由值引用,而不是通过引用引用,因此当您创建一个变量时,指向'对于另一个变量的结构,它将整个结构复制到新变量中,而不是复制引用。