2017-07-16 10 views
0

C#では、参照によってパラメータを渡すことができます。例えば:TypeScript渡しrefパラメータ

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

this.Root私は活字体から見てきたものからAdd(ref this.Root)

を行った後、ヌルではないでしょう、参照によってパラメータを渡すことはできません。このコード:それのコピーがaddAuxに渡されますので、addAux(this._root)を行った後

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

this._rootはまだ未定義になります。

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

上記はうまくいくが、IMHOでは正しい方法ではありません。その代わりに、メソッドから新しい値を返すことで(つまり、呼び出し元が変数に新しい値を再割り当てするかどうかを決定することによって)、言語を使って作業してください。方法。 –

0

これは可能ですか?

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

this._root = addAux(this._root); 

注 - これはTypeScriptではなくJavaScriptの質問です。 JSのデータ型は常に値渡しです。

+1

オブジェクトはrefで渡されません。そうであれば、OPはこの質問を作成する必要はありません。参照はvalueによって渡されます。これは、関数がその参照のコピーを取得することを意味します。 – MistyK

+0

@MistyK JSが技術的に「ref by pass」か「object sharing by pass」のどちらが問題の一部かどうかはわかりませんが、簡潔にするために単純化しています。 this._rootはオブジェクトではないため、値渡しとなり、オブジェクトとは関係ありません。 – Bruford

+0

_「簡潔にするために簡素化していました」_書面_は単純化していません。それは単に**間違った**です。 JavaScriptは、オブジェクトへの参照である値を含め、すべての値を渡します。参照渡しとは、_variable_自体への参照が渡され、_variable_自体が変更される可能性があることを意味します。これは、オブジェクトへの参照を渡すのと同じではありません。例えば、 https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_referenceとhttps://stackoverflow.com/q/373419 –

関連する問題