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;设置(属性)不能解决或改变手头的实际问题。谢谢。这把它修好了。