C# 如何分配引用字段
我想指出b.x的地址与a.x相同。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实例的内部值即可
如果是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。非常感谢。