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);
}
现在我的问题是如何在下面的流程中跟踪这些多个对象引用
这是可行的,但我无法理解这些多重引用是如何工作的?我假设工作簿是一个类
- 对于类,每次声明类变量时,如
Workbook myworkbook代码>,它声明变量
的类型为myworkbook
,它将存储空引用,因为没有分配内存Workbook
Workbook myworkbook=新工作簿()代码>这将初始化对象并根据工作簿的类声明中声明的类成员分配内存。同步块索引和类型对象指针的额外内存也与堆中的类成员一起分配
- 如果您尝试下面这样的声明,那么变量
将只包含对已创建的myworkbook2
的引用。因此,不使用额外的内存。但是,变量myworkbook2将在内存堆栈中myworkbook
Workbook myworkbook = new Workbook(); Workbook myworkbook2 = myworkbook;
- 跨方法传递参数可以通过两种方式完成。通过
或通过参考
传递。在.net中,默认情况下,参数通过值传递给方法。但是,如果要传递一个类,由于该类是引用类型,因此将传递该引用。因此,如果您对参数的属性进行了任何更改,那么相同的更改将反映在调用函数中,这在您的情况下发生值
我假设工作簿是一个类
- 对于类,每次声明类变量时,如
Workbook myworkbook代码>,它声明变量
的类型为myworkbook
,它将存储空引用,因为没有分配内存Workbook
Workbook myworkbook=新工作簿()代码>这将初始化对象并根据工作簿的类声明中声明的类成员分配内存。同步块索引和类型对象指针的额外内存也与堆中的类成员一起分配
- 如果您尝试下面这样的声明,那么变量
将只包含对已创建的myworkbook2
的引用。因此,不使用额外的内存。但是,变量myworkbook2将在内存堆栈中myworkbook
Workbook myworkbook = new Workbook(); Workbook myworkbook2 = myworkbook;
- 跨方法传递参数可以通过两种方式完成。通过
或通过参考
传递。在.net中,默认情况下,参数通过值传递给方法。但是,如果要传递一个类,由于该类是引用类型,因此将传递该引用。因此,如果您对参数的属性进行了任何更改,那么相同的更改将反映在调用函数中,这在您的情况下发生值
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何时归还?何时返回作为参数传递的工作簿?使所有方法都将工作簿作为参数,或将工作簿作为构造函数参数传递。如果您想拥有一个主工作簿,请创建一个方法