在方法内初始化变量

时间:2017-09-14 13:19:08

标签: c# asp.net

如果我初始化这样的变量:

假设我们有:

T obj = GetT();

在aspx页面中。 (GetT()可以返回空值) 我想在函数

中处理这个obj
public void HandlingT(T obj){
    if(condition && obj == null){
        obj = new T();
    }
    //...handling object T
}

所以我们得到:

T obj = GetT();
HandlingT(obj);

问题是,当我在aspx页面中调用函数HandlingT()时,即使obj为真,condition仍然为空

2 个答案:

答案 0 :(得分:1)

然后使用Generic将您的方法更改为如下所示返回T。基本上,您正在创建对象但不返回它,因此当超出函数范围时它变为null

public T HandlingT<T>(T obj){

如果T只是实际对象的占位符,那么您应该只喜欢

public T HandlingT(T obj){
    if(condition && obj == null){
        obj = new T();
    }
    //...handling object T

   return obj;
}

答案 1 :(得分:0)

您将引用与值混淆。当你这样做时:

T obj = GetT();
HandlingT(obj);

然后在HandlingT方法内部执行此操作:

obj = new T();

对该方法的创建的obj变量 nothing 。这些变量巧合地具有相同的名称,但它们不是同一个变量。您正在做的是创建T的实例并将其分配给方法中的 local 变量。如果要将该引用分配给方法之外的变量,则必须在 变量上执行该分配。

例如,您可以从方法中返回实例:

public T HandlingT(T obj){
    if(condition && obj == null){
        obj = new T();
    }
    return obj;
}

并在方法之外使用该返回值:

T obj = GetT();
obj = HandlingT(obj);

基本上,赋值发生在变量上,而不发生在内存中的对象上。如果使用变量引用对象,则可以更改该内存中对象。但是,如果将变量分配给新对象,则不会更改最初指向的变量,而只是将其指向其他内容。

考虑一下:

void DoSomething(MyObj obj)
{
    obj = new MyObj();
    obj.Something = "foo";
}

该示例对最初传递给该方法的实例不执行任何操作。将创建一个新实例,并仅在该方法中引用。一旦该方法退出,该实例将被垃圾收集,并且传递给该方法的原始实例未被修改。

与此相反:

void DoSomething(MyObj obj)
{
    obj.Something = "foo";
}

由于没有创建新实例,因此本地obj变量仍指向传递给该方法的相同内存中实例。遵循该引用并修改原始实例,以便在方法完成后在方法外部可以看到修改。