C# 如何分配引用字段

C# 如何分配引用字段,c#,ref,C#,Ref,我想指出b.x的地址与a.x相同。 如果是C语言,就指出它。 但在C#中,ref关键字只能使用参数。 b.x怎么能有a.x的地址 嗯。补充信息 的实例具有0x0000 b的实例有0x0100 如果a.x=new x()则a.x指向的x实例:0xF000 然后b.x=a.xb.x指向的x实例:0xF000不是a.x的地址:0x0000+sizeof(x) 我想让b.x有a.x的热情。Not Value的address关键字new创建类X 不要创建新对象并将其分配给a.x,只需修改x实例的内部值即可

我想指出b.x的地址与a.x相同。
如果是C语言,就指出它。
但在C#中,ref关键字只能使用参数。
b.x怎么能有a.x的地址

嗯。补充信息

的实例具有0x0000
b的实例有0x0100
如果a.x=new x()则a.x指向的x实例:0xF000
然后
b.x=a.x
b.x指向的x实例:0xF000不是a.x的地址:0x0000+sizeof(x)

我想让b.x有a.x的热情。Not Value的address

关键字
new
创建类
X

不要创建新对象并将其分配给
a.x
,只需修改
x
实例的内部值即可

public class SomeClass
{
    public X x;
    string name;
    string someInfo;
    public SomeClass(string name,...)
    {
       //....
    }
}
public class X
{
}

SomeClass a = new SomeClass(~~~);
SomeClass b = new SomeClass(~~~);

a.x = new X();    //this new X instance call X1
b.x = a.x;        //a.x = b.x => X1


a.x = new X();    //this new X instance call X2
                  //a.x == X2   b.x== X1
                  //b.x doesn't change when a.x changed.

//////////////////////////////////////////////////////////////
a.x = new X(); //a.x= b.x =>X2 - this what i want.
正如您对“X1”所做的那样,只需在结尾再次执行此操作:

b.x=a.x//a、 x=b.x=>X2

而不是


a.x=newx()

要做你想做的事,你应该说:

a.x.name = "2";
现在,如果设置:

a = new SomClass();
b = a;
现在b.x将包含与a.x相同的对象(因为b==a)

如何分配引用字段

你没有。这就是为什么您应该使用
属性
而不是
字段

我想指出的是b.x和a.x的地址是一样的

您的代码是完全无效的,所以它真的没有意义:

a.x = new X();
b
来自哪里?它是如何初始化的?为什么可以指定x

这可能是一个错误,因为您所做的工作没有提供任何价值为什么这很重要。也就是说,这应该如您所描述的那样工作,但是在过去的10年中,我从来没有写过这段代码,所以我怀疑这是一个错误


YMMV,这真的是一个糟糕的模式(实现的想法)。

不幸的是,在C#
中没有存储变量引用的本机方法。幸运的是,有很多方法可以使
b
的X对象引用与
a
的X对象引用保持同步

  public class SomeClass
  {
    public X x;
  }

  public class X
  {
    public int i; // I added this int to verify which X object we're working with.
    public X(int i)
    {
      this.i = i;
    }
  }
  SomeClass a = new SomeClass();
  SomeClass b = a;

  a.x = new X(1);
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
  a.x = new X(2);
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
首先,课程:

public class X1 { }
public class SomeClass
{
  private static X1 _X = new X1();

  public X1 X 
  {
    get 
    {
      return _X;
    }
  }
}

var a = new SomeClass();
var b = new SomeClass();
Assert.That(a.X, Is.EqualTo(b.X)) // true, always
场景1:如果需要引用新的X对象。 选项1:如果
a
b
需要是不同的SomeClass对象,则只需将
b
的X对象引用更新为
a
的X对象引用即可

  public class SomeClass
  {
    public X x;
  }

  public class X
  {
    public int i; // I added this int to verify which X object we're working with.
    public X(int i)
    {
      this.i = i;
    }
  }
  SomeClass a = new SomeClass();
  SomeClass b = a;

  a.x = new X(1);
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
  a.x = new X(2);
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
选项2:如果
b
不需要与
a
不同,则让
b
引用与
a
相同的SomeClass对象

  SomeClass a = new SomeClass();
  SomeClass b = new SomeClass();

  a.x = new X(1);
  b.x = a.x;
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
  a.x = new X(2);
  b.x = a.x;
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
场景2:如果只需要修改X对象的内部值。 由于
a.x
b.x
是同一个x对象,因此可以使用引用修改该对象,也可以使用其他引用修改更改的视图

  public class SomeClass
  {
    public X x;
  }

  public class X
  {
    public int i; // I added this int to verify which X object we're working with.
    public X(int i)
    {
      this.i = i;
    }
  }
  SomeClass a = new SomeClass();
  SomeClass b = a;

  a.x = new X(1);
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
  a.x = new X(2);
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
场景3:如果您希望另一个类始终能够轻松访问
一个
的X对象。
新类别:

  SomeClass a = new SomeClass();
  SomeClass b = new SomeClass();

  a.x = new X(1);
  b.x = a.x;
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
  a.x.i = 2;
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
  b.x.i = 3;
  Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:3, b.x.i:3
使用新类:

  public class SomeClass2
  {
    private SomeClass someClass;
    public X x { get { return someClass.x; } }
    public SomeClass2(SomeClass sc)
    {
      someClass = sc;
    }
  }
场景4:如果要将本地别名设置为
a.x
。 使用类:

  public class SomeClass3
  {
    public Func<X> x;
  }

我的意思是相同的地址,而不是值。我不想要a.x.name==b.x.name那么a.x有X3,b.x有X1。我不确定X1是否与X3X1 X2相同只是为了区别。这个代码是简化的。如果var c=newsomeclass();而且想成为c.x!=a、 那么怎么做?我只是想知道怎么做b.x和a.x有相同的地址。不是静态的,不是像ref关键字那样的a=b。是的,有人说使用不安全的。但我知道不安全不被推荐。这就是为什么要问这个问题。我不知道为什么每个人都给我一个疯狂的答案。
没有本地的方法在C#
中存储对变量的引用,这就是我想要的。我试试Sc4。非常感谢。