如果我初始化这样的变量:
假设我们有:
T obj = GetT();
在aspx页面中。 (GetT()
可以返回空值)
我想在函数
public void HandlingT(T obj){
if(condition && obj == null){
obj = new T();
}
//...handling object T
}
所以我们得到:
T obj = GetT();
HandlingT(obj);
问题是,当我在aspx页面中调用函数HandlingT()
时,即使obj
为真,condition
仍然为空
答案 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
变量仍指向传递给该方法的相同内存中实例。遵循该引用并修改原始实例,以便在方法完成后在方法外部可以看到修改。