您將引用與值混淆在一起。當你這樣做:
T obj = GetT();
HandlingT(obj);
然後裏面的HandlingT
方法做到這一點:
obj = new T();
那請問什麼創建該方法之外的obj
變量。這些變量巧合地具有相同的名稱,但它們不是同一個變量。你正在做的是創建一個實例T
並將其分配給該方法中的本地變量。如果要將該引用分配給方法外部的變量,則該分配必須在上執行,即變量。
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
變量仍指向被傳遞給方法的相同內存實例。遵循該引用並修改原始實例,以便在方法完成後在方法外部可以看到修改。
或者我應該把T的地址放在handleT()方法中嗎? – kevricher
你可以包含代碼的ASPX一面嗎? – combatc2
嘗試'處理T(出T obj)' –