在方法中实例化 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);

此时,方法外的 myListdoSomethingWithAList 内的 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();