[英]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);
此时,方法外部的myList
和doSomethingWithAList
内部的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.