2017-09-14 47 views
-1

初始化變量如果我初始化變量是這樣的:裏面方法

假設我們有:

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); 

的問題是,當我調用函數HandlingT()在aspx頁面,obj仍空即使condition爲真

+0

或者我應該把T的地址放在handleT()方法中嗎? – kevricher

+0

你可以包含代碼的ASPX一面嗎? – combatc2

+2

嘗試'處理T(出T obj)' –

回答

0

您將引用與值混淆在一起。當你這樣做:

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變量仍指向被傳遞給方法的相同內存實例。遵循該引用並修改原始實例,以便在方法完成後在方法外部可以看到修改。

+0

非常感謝@David,你教給我的東西我不知道面向對象 – kevricher

+0

@kevricher這無關緊要使用面向對象的編程,這只是值與引用語義的區別。 – Servy

1

然後改變你的方法返回T像下面使用通用。從本質上講,你所創建的對象,但沒有返回它,因此當函數範圍

public T HandlingT<T>(T obj){ 

如果T外面去成爲null僅僅是實際對象的佔位符,那麼你應該只是像

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

    return obj; 
} 
+0

我認爲泛型位在這裏只是一個紅色的鯡魚,看起來OP只是用'T'作爲真實代碼的佔位符。此外,在這裏改變參數'ref'應該就夠了(儘管我更喜歡像你用過的那樣的回報) – DavidG

+0

@DavidG,很好,可能會很困惑,但是對於使用'T'有疑問,但無論如何,已經足夠清楚了 – Rahul

+0

對不起使用T的誤解,在這裏我將T引用到我創建的一個類 – kevricher