2017-07-16 186 views
0

在C#中可以通過引用傳遞參數。例如:TypeScript通過引用參數

private void Add(ref Node node) 
    { 
     if (node == null) 
     { 
      node = new Node(); 
     } 
    } 
    Add(ref this.Root); 

this.RootAdd(ref this.Root)

從我從打字稿看到後,就不可能按引用傳遞參數就不會是空。此代碼:

private addAux(node: Node): void { 
     if (node === undefined) { 
      node = new Node(); 
     } 
    } 
    addAux(this._root); 

addAux(this._root)後,this._root仍然是不確定的,因爲它的一個副本將被傳遞到addAux

在TypeScript中,是否有一種解決方法與C#中的ref關鍵字具有相同的功能?

回答

1

唯一的解決辦法,我可以現在來是做這樣的事情:

private addAux(ref: {node: Node}): void { 
    if (ref.node === undefined) { 
     ref.node = new Node(); 
    } 
} 
let mutable = {node: this._root}; 
addAux(mutable); 

在此之後,mutable不會取消定義的對象內部的節點。

+0

對象'mutable'內的節點不會未定義,但'this._root'將繼續未定義。 – Bsa0

+0

是的,這個建議是關於不再使用this._root,而是使用mutable.node。否則,我很確定你不能模仿C#'ref'語法。 – lilezek

+0

以上將工作,但不是恕我直言,正確的方式來做到這一點。相反,通過返回方法中的新值(因此調用者可以決定是否將新值重新分配給變量)來使用語言來工作,而不是試圖將虛假的傳遞參考引入到方法。 –

0

你可以這樣做嗎?

private addAux(node: Node): Node { 
    if (node === undefined) { 
     node = new Node(); 
    } 
    return node 
} 

this._root = addAux(this._root); 

作爲一個說明 - 這是一個JavaScript問題,而不是TypeScript。 JS中的數據類型總是按值傳遞。

+1

對象不通過ref。如果是這樣的話,OP不會產生這個問題。引用是通過值傳遞的,這意味着函數獲取它的一個副本。 – MistyK

+0

@MistyK我不確定JS在技術上是'通過引用'還是'通過對象共享'或'按值傳遞,但值是引用'實際上是問題的一部分,我簡化爲簡潔起見。 問題是,this._root是未定義的,它不是一個對象,因此被值傳遞 - 與對象無關。 – Bruford

+0

_「爲了簡潔起見,我簡化了」___寫作_「,但通過ref的對象除外」_不是簡化。這只是**錯誤**。 JavaScript按值傳遞所有內容,包括引用對象的值。傳遞引用意味着對_variable_本身的引用被傳遞,所以_variable_本身可能會被改變。這與傳遞對象的引用不同。見例如https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference和https://stackoverflow.com/q/373419。 –