C# 多个对象引用

C# 多个对象引用,c#,.net,object,C#,.net,Object,这个问题是关于对象引用的 下面是我的助手课 class helperv2 { Workbook mainworkbook; //fill column names method public void FillColumnnames(DatabaseAdapter db,Workbook workbook) { //do some random stuff //at the end of method mainw

这个问题是关于对象引用的

下面是我的助手课

class helperv2
{
    Workbook mainworkbook;
    //fill column names method
    public void FillColumnnames(DatabaseAdapter db,Workbook workbook)
    {
        //do some random stuff 

        //at the end of method
        mainworkbook = workbook;
    }
    public Workbook filldata(string sql)
    {
        //do some work on mainworkbook instance and return mainworkbook

        return mainworkbook;
    }
}
现在我在我的一个方法中使用上面的helper类,如下所示

public string buildworkbook(Workbook workbook)
{
    helperv2 hlp=new helperv2();
    hlp.fillcolumnames(db,workbook);
    workbook=hlp.filldata(string sql);
}
现在我的问题是如何在下面的流程中跟踪这些多个对象引用

  • Buildworkbook获取传递的空工作簿实例
  • 现在填写列名,填写工作簿中的所有列,并在 它指向mainworkbook实例的结尾
  • 现在,“填充数据”在mainworkbook实例上工作,并填充数据和 它返回一个工作簿
  • 如您所见,我再次将其分配给工作簿实例并返回它


    这是可行的,但我无法理解这些多重引用是如何工作的?

    我假设工作簿是一个类

    • 对于类,每次声明类变量时,如
      Workbook myworkbook,它声明变量
      myworkbook
      的类型为
      Workbook
      ,它将存储空引用,因为没有分配内存
    • Workbook myworkbook=新工作簿()这将初始化对象并根据工作簿的类声明中声明的类成员分配内存。同步块索引和类型对象指针的额外内存也与堆中的类成员一起分配
    • 如果您尝试下面这样的声明,那么变量
      myworkbook2
      将只包含对已创建的
      myworkbook
      的引用。因此,不使用额外的内存。但是,变量myworkbook2将在内存堆栈中

       Workbook myworkbook = new Workbook();
       Workbook myworkbook2 = myworkbook;
      
    • 跨方法传递参数可以通过两种方式完成。通过
      参考
      或通过
      传递。在.net中,默认情况下,参数通过值传递给方法。但是,如果要传递一个类,由于该类是引用类型,因此将传递该引用。因此,如果您对参数的属性进行了任何更改,那么相同的更改将反映在调用函数中,这在您的情况下发生

    从,附加阅读:

    引用类型的变量不直接包含其数据;信息技术 包含对其数据的引用。当传递引用类型时 参数的值,可以更改 引用,例如类成员的值。然而,你 无法更改引用本身的值;也就是说,你不能 使用相同的引用为一个新类分配内存,并将其保存 坚持在街区之外。为此,请使用 ref或out关键字。为简单起见,以下示例使用ref


    我假设工作簿是一个类

    • 对于类,每次声明类变量时,如
      Workbook myworkbook,它声明变量
      myworkbook
      的类型为
      Workbook
      ,它将存储空引用,因为没有分配内存
    • Workbook myworkbook=新工作簿()这将初始化对象并根据工作簿的类声明中声明的类成员分配内存。同步块索引和类型对象指针的额外内存也与堆中的类成员一起分配
    • 如果您尝试下面这样的声明,那么变量
      myworkbook2
      将只包含对已创建的
      myworkbook
      的引用。因此,不使用额外的内存。但是,变量myworkbook2将在内存堆栈中

       Workbook myworkbook = new Workbook();
       Workbook myworkbook2 = myworkbook;
      
    • 跨方法传递参数可以通过两种方式完成。通过
      参考
      或通过
      传递。在.net中,默认情况下,参数通过值传递给方法。但是,如果要传递一个类,由于该类是引用类型,因此将传递该引用。因此,如果您对参数的属性进行了任何更改,那么相同的更改将反映在调用函数中,这在您的情况下发生

    从,附加阅读:

    引用类型的变量不直接包含其数据;信息技术 包含对其数据的引用。当传递引用类型时 参数的值,可以更改 引用,例如类成员的值。然而,你 无法更改引用本身的值;也就是说,你不能 使用相同的引用为一个新类分配内存,并将其保存 坚持在街区之外。为此,请使用 ref或out关键字。为简单起见,以下示例使用ref


    NET中对象的所有变量都是引用。这意味着类的所有变量都只是指向实际对象的链接。变量不包含它

    因此,如果您这样做:

    Workbook book;
    
    var book = new Workbook();
    var book2 = book;
    
    您没有得到实际的对象。您可以通过尝试修改来自己尝试:

    Workbook book;
    book.Title = "Hello"; //will throw NullReferenceException.
    
    通过调用
    new
    ,可以创建新对象:

    //this code will create four new workbooks.
    new Workbook();
    new Workbook();
    new Workbook();
    new Workbook();
    
    但是,由于没有在变量中存储引用,垃圾收集器将删除这些对象,因为所有未引用的对象都将被收集

    所以当你这样做的时候:

    Workbook book;
    
    var book = new Workbook();
    var book2 = book;
    
    您只需声明
    book2
    应指向与
    book
    相同的对象。不创建新对象

    返回值也是如此:

    public Workbook DoSomething(Workbook book)
    {
       book.Title = "Hello";
       return book;
    }
    
    var book = new Workbook();
    var book2 = DoSomething(book);
    
    book2
    book
    仍将指向同一对象,因为所有类变量都包含对实际对象的引用

    由于变量是引用,因此不必使用返回值。要更改原始对象,这就足够了:

    public void DoSomething(Workbook book)
    {
       book.Title = "Hello";
    }
    
    var book = new Workbook();
    DoSomething(book);
    // 'book' now got a new title.
    
    现在回到你的代码。按照您设计util类的方式,没有人会理解它是如何工作的。主wookbook何时归还?何时返回作为参数传递的工作簿?使所有方法都将工作簿作为参数,或将工作簿作为构造函数参数传递。如果您想拥有一个主工作簿,请创建一个方法