在方法中实例化 class
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
class 可以在方法内部实例化并在方法外部使用吗?
是的,但您必须通过引用传递参数:
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
:
void doSomethingWithAList(List<T> list)
{
list = new List<T>();
}
只有 list
指向那个新对象。 myList
仍然指向 0x1234
。
一旦您使方法采用 List<T>
通过引用更新 list
点,也会更新 myList
指向方法外部的点。
我认为混淆是所有参数都按值传递给另一个方法。因此,当您将引用类型传递给方法时,引用的副本会传递给该方法。
在您的示例中,c1 最初指向 null。当您调用实例化时,c1 的一个副本,我将创建它命名为 c1_(它指向 null)并且 c1_ 被传递到实例化方法中,而不是 c1。
有两种方法可以让您的代码正常工作。第一种方法是使用 ref 关键字。 ref 关键字将允许将 c1 传递到方法中。
void Instantiate(ref Class c) {
c = new Class();
}
并这样称呼它
Instantiate(ref c1);
我建议您在此特定示例中使用 return 类型。
Class Instantiate() {
return new Class();
}
您可以通过以下方式使用方法。
Class c1 = Instantiate();
是否可以这样做
void Instantiate(Class c) {
c = new Class();
}
Class c1 = null;
Instantiate(c1);
c1.property .....gives me null reference exception
class 可以在方法内部实例化并在方法外部使用吗?
是的,但您必须通过引用传递参数:
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
:
void doSomethingWithAList(List<T> list)
{
list = new List<T>();
}
只有 list
指向那个新对象。 myList
仍然指向 0x1234
。
一旦您使方法采用 List<T>
通过引用更新 list
点,也会更新 myList
指向方法外部的点。
我认为混淆是所有参数都按值传递给另一个方法。因此,当您将引用类型传递给方法时,引用的副本会传递给该方法。
在您的示例中,c1 最初指向 null。当您调用实例化时,c1 的一个副本,我将创建它命名为 c1_(它指向 null)并且 c1_ 被传递到实例化方法中,而不是 c1。
有两种方法可以让您的代码正常工作。第一种方法是使用 ref 关键字。 ref 关键字将允许将 c1 传递到方法中。
void Instantiate(ref Class c) {
c = new Class();
}
并这样称呼它
Instantiate(ref c1);
我建议您在此特定示例中使用 return 类型。
Class Instantiate() {
return new Class();
}
您可以通过以下方式使用方法。
Class c1 = Instantiate();