繁体   English   中英

实例化方法中的类

[英]Instantiating a class inside a method

是否有可能做到这一点

void Instantiate(Class c) {
   c = new Class();
}

Class c1 = null;
Instantiate(c1);
c1.property .....gives me null reference exception

是否可以在方法内部实例化类并在方法外部使用类?

是的,但是您必须通过引用传递参数:

void Instantiate(ref Class c) {
   c = new Class();
}

Class c1 = null;
Instantiate(ref c1);

默认情况下,所有参数均按值传递。 对于引用类型,引用是要传递的值。 因此,如果更改对象的内部状态,它将在方法外部可见(例如,将元素添加到列表中)。 但是,但是您不能替换整个实例-调用者将看不到该更改。

假设您有一个List<T>

var myList = new List<T>();

让我们假设它是在一些内存位置0x1234初始化的。 现在,将其传递给采用List<T>

void doSomethingWithAList(List<T> list)
{
}

然后

doSomethingWithAList(myList);

此时,方法外部的myListdoSomethingWithAList内部的list指向相同的地址(0x1234) 如果执行list.Add(default(T))并稍后调用myList.Lenghth ,则会得到1,因为它们都指向0x1234处的同一对象。

但是,如果在doSomethingWithAList内,则为list分配一个新list

void doSomethingWithAList(List<T> list)
{
    list = new List<T>();
}

list指向该新对象的点。 myList仍指向0x1234

一旦您通过引用使方法采用List<T>进行更新,那么哪些list点也将更新myList指向该方法外部的内容。

我认为混淆是所有参数都按值传递给另一种方法。 因此,当您将引用类型传递给方法时,引用的副本将传递给方法。

在您的示例中,c1最初指向null。 当您调用实例化时,将创建一个c1的副本,我将其命名为c1_(它指向空),并将c1_传递给实例化方法,而不是c1。

有两种方法可以使代码正常工作。 第一种方法是使用ref关键字。 ref关键字将允许c1传递到方法中。

void Instantiate(ref Class c) {
   c = new Class();
}

并这样称呼它

Instantiate(ref c1);

我建议您在此特定示例中使用返回类型。

Class Instantiate() {
   return new Class();
}

您可以通过以下方式使用该方法。

Class c1 = Instantiate();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM