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
是一个值类型(a
struct
),那么赋值将复制该值
myFoo1
myFoo2
将彼此完全独立。

您无法阻止这一点
myFoo1
属于
foo
类型,因此可以将其分配给
myFoo2
,句点

在任何情况下,都不清楚你认为通过阻止这种情况可以得到什么。由于
foo
是一种引用类型(一种
),因此赋值的结果是,以前只有一个名称可引用您创建的
foo
对象,而现在只有两个名称。因为名称只是为了方便开发人员,所以程序的行为没有区别。分配不会创建另一个对象


注意,如果
foo
是一个值类型(a
struct
),那么赋值将复制该值
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很好奇