C# 如何防止类引用自己的类?
如何防止类隐式引用自己的类 例如:C# 如何防止类引用自己的类?,c#,class,reference,copy,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.Re
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();
}
}
你无法阻止这一切
myFoo1
属于foo
类型,因此可以将其分配给myFoo2
,句点
在任何情况下,都不清楚你认为通过阻止这种情况可以得到什么。由于foo
是一种引用类型(一种类
),因此赋值的结果是,以前只有一个名称可引用您创建的foo
对象,而现在只有两个名称。因为名称只是为了方便开发人员,所以程序的行为没有区别。分配不会创建另一个对象
注意,如果
foo
是一个值类型(astruct
),那么赋值将复制该值myFoo1
和myFoo2
将彼此完全独立。您无法阻止这一点myFoo1
属于foo
类型,因此可以将其分配给myFoo2
,句点
在任何情况下,都不清楚你认为通过阻止这种情况可以得到什么。由于foo
是一种引用类型(一种类
),因此赋值的结果是,以前只有一个名称可引用您创建的foo
对象,而现在只有两个名称。因为名称只是为了方便开发人员,所以程序的行为没有区别。分配不会创建另一个对象
注意,如果
foo
是一个值类型(astruct
),那么赋值将复制该值myFoo1
和myFoo2
将彼此完全独立。您不能用那种方式限制变量。类型为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
}
你不能用那种方式限制变量。类型为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
}
简言之,你对你认为正在发生的事情感到困惑(或者至少对措辞感到困惑) 在C#中,内存中有对象,以及对这些对象的引用。当你这样做的时候
foomyfoo1=新的foo(10)代码>
myFoo1
是一个引用,引用的值是内存中存储foo
类型对象的位置
当你这样做的时候
foomyfoo2=myFoo1代码>
myFoo2是一个引用,引用的值是内存中存储foo
类型对象的位置,即完全相同的对象。两个参考都在做相同的事情,没有区别
myFoo2
和myFoo1
都在做相同的事情,那么如何在允许另一个的同时防止其中一个呢
如果您的意思是“如何防止两个变量引用同一对象?”根据您的意思,有两种解决方案:
如果问题是有两个变量引用同一个对象,一个变量变异对象,另一个变量“意外”看到更改,使对象不可变,并且对象的“变异”实际返回一个新的、不可变的对象以及所做的更改
可以将对象设为结构。结构是由值引用的,而不是由引用引用引用的,因此当您将一个变量“指向”另一个变量的结构时,它会将整个结构复制到新变量中,而不是复制引用
简言之,你对你认为正在发生的事情感到困惑(或者至少对措辞感到困惑)
在C#中,内存中有对象,以及对这些对象的引用。当你这样做的时候
foomyfoo1=新的foo(10)代码>
myFoo1
是一个引用,引用的值是内存中存储foo
类型对象的位置
当你这样做的时候
foomyfoo2=myFoo1代码>
myFoo2是一个引用,引用的值是内存中存储foo
类型对象的位置,即完全相同的对象。两个参考都在做相同的事情,没有区别
myFoo2
和myFoo1
都在做相同的事情,那么如何在允许另一个的同时防止其中一个呢
如果您的意思是“如何防止两个变量引用同一对象?”根据您的意思,有两种解决方案:
如果问题是有两个变量引用同一个对象,一个变量变异对象,另一个变量“意外”看到更改,使对象不可变,并且对象的“变异”实际返回一个新的、不可变的对象以及所做的更改
可以将对象设为结构。结构是由值引用的,而不是由引用引用引用的,因此当您将一个变量“指向”另一个变量的结构时,它会将整个结构复制到新变量中,而不是复制引用
我很想知道你在想什么情况,你想在哪里防止这种情况。也许他不知道如何在C#中实现单例?不知道静态类之类的东西吗?我只是在猜测。你为什么要阻止它?@Kevin:单例或静态都没用。他不是在阻止多个实例,他是在阻止对同一个实例的多个引用。嗯,这只是一种特殊情况,我只是不想让它发生。。。无论是结构还是类:)我对k很好奇