C# 如何在类之间传递对象
所以我在这里试图做的是将一个类(C# 如何在类之间传递对象,c#,object,C#,Object,所以我在这里试图做的是将一个类(class a)的相同副本传递给另一个类(class B),但是class B在class a中实例化 在class B中使用new语句将不起作用,因为当我希望能够使用class a的第一个实例中的变量时,它将导致无限循环,并创建它的新实例 我知道object.equals(),但在class B中定义class A的对象之前,我无法使用它。仅使用object.equals将导致空引用 public partial class class_A : Form {
class a
)的相同副本传递给另一个类(class B
),但是class B
在class a
中实例化
在class B
中使用new
语句将不起作用,因为当我希望能够使用class a
的第一个实例中的变量时,它将导致无限循环,并创建它的新实例
我知道object.equals()
,但在class B
中定义class A
的对象之前,我无法使用它。仅使用object.equals
将导致空引用
public partial class class_A : Form
{
public class_B _class_B = new class_B;
public Int32 var;
private void setclassA()
{
_class_B._class_A.equals(this);
}
}
public class class_B
{
public class_A _class_A; // I know this is null
// code
}
就像我说的,我希望避免实例化类a的新副本,因为我希望设置类a中的值
我已经尝试使用一个方法来做这件事,但仍然得到一个空引用 试试这个:
public partial class class_A : Form
{
public class_B _class_B = new class_B;
public Int32 var;
private void setclassA()
{
_class_B._class_A.equals(this);
}
}
public class class_B
{
public class_A _class_A; // I know this is null
// code
}
public class A
{
public B Instance_B;
public A(B b)
{
Instance_B = b;
}
}
public class B
{
public A Instance_A;
public B()
{
Instance_A = new A(this);
}
}
使用
get;设置代码>
在A类中
:
public partial class class_A : Form
{
Class_B B = new Class_B();
B.Class_A = this;
public Int32 var;
}
然后在B类中
:
public class class_B
{
Class_A A { get; set; }
// code
}
在B
的构造函数中传递A
:
public class class_B
{
Class_A A { get; set; }
// code
}
public class A
{
private B _b;
public A()
{
_b = new B(this);
}
}
public class B
{
private A _a;
public B(A a)
{
_a = a;
}
}
如评论中所述,您完全误解了.Equals()
。它用于比较两个对象是否相等,而不是克隆/传递引用 答复
你的分数是75%。正如Ron提到的,只需将.equals(this)
更改为=this
,如下所示:
_class_B._class_A = this;
解释
如果我们想将ClassA
的同一副本传递给ClassB
,并在ClassA
内部实例化ClassB
时执行此操作,那么我们使用this
关键字,它表示类的当前实例
尽管有其他方法可以将此
赋予ClassB
,但下面的示例显示了两种方法:
将此
传递给构造函数,并在ClassB
中进行属性赋值,或
将此
直接分配给ClassB
中的属性
关键是=
是赋值运算符,而Equals()
检查两个变量是否引用同一对象
例子
概念证明
并在最新版本中打印出“它们是同一个对象”和其他一些东西
using System;
public class Program
{
public static void Main()
{
var classA = new ClassA();
if(classA.Equals(classA.MyClassB1.MyClassA) &&
classA.Equals(classA.MyClassB2.MyClassA) &&
classA.MyClassB1.MyClassA.Equals(classA.MyClassB2.MyClassA))
{
Console.WriteLine("They are the same object.");
}
}
}
一个重要的注意事项是,当我们使用它时,我们给ClassB
一个对ClassA
的引用,而不是它的副本。这些是非常不同的事情。你完全误解了Equals()
是正确的方法,Equals
是验证这两个实例是否相等的检查(在这种情况下它们不能相等)。顺便说一句,当你以代码为例发布代码时,请确保它是编译的。这有助于我们复制代码并调试您的问题,而不是糟糕的代码。这里有很多东西不会编译,也永远不会编译。在对象完成之前发布对象引用是违反原则的,例如在构造函数中将此引用传递给其他对象。如果你想教好实践,请使用公共属性,而不是公共字段。这是一种方法,但纯粹使用get;设置(属性)不能解决或改变手头的实际问题。谢谢。这把它修好了。