C# TypeScript通过ref参数传递

C# TypeScript通过ref参数传递,c#,typescript,C#,Typescript,在C#中,可以通过引用传递参数。例如: private void Add(ref Node node) { if (node == null) { node = new Node(); } } Add(ref this.Root); this.Root在执行Add(ref this.Root) 从我在TypeScript中看到的情况来看,通过引用传递参数是不可能的。此代码: priv

在C#中,可以通过引用传递参数。例如:

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

从我在TypeScript中看到的情况来看,通过引用传递参数是不可能的。此代码:

    private addAux(node: Node): void {
        if (node === undefined) {
            node = new Node();
        }
    }
    addAux(this._root);
执行
addAux(this.\u root)
后,
this.\u root
仍将是未定义的,因为它的副本将传递到
addAux


是否有一种变通方法可以与TypeScript中的C#中的
ref
关键字具有相同的功能?

我现在可以使用的唯一变通方法是执行以下操作:

private addAux(ref: {node: Node}): void {
    if (ref.node === undefined) {
        ref.node = new Node();
    }
}
let mutable = {node: this._root};
addAux(mutable);
在此之后,对象
可变
中的节点将不会被取消定义

你能做到吗

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

this._root = addAux(this._root);

请注意,这是一个JavaScript问题,而不是TypeScript。JS中的数据类型始终是按值传递的。

对象
mutable
中的节点不会未定义,但
将继续未定义。_root
将继续未定义。是的,建议不再使用此。_root,而是使用mutable.node。否则我很确定你不能模仿C#
ref
语法。上面的方法可以,但不是正确的方法。相反,通过从方法返回新值(以便调用者可以决定是否将新值重新分配给变量),而不是尝试将一个伪的按引用传递到方法中来使用该语言。对象不是按引用传递的。如果是这样,OP就不必创建此问题。引用是按值传递的,这意味着函数得到了它的一个副本。@MistyK我不确定JS在技术上是“按引用传递”还是“按对象共享传递”或“按值传递”,但该值是一个引用,这实际上是问题的一部分,为了简洁起见,我对其进行了简化。问题在于,_root是未定义的,它不是一个对象,因此是通过值传递的-与对象无关。“我是为了简洁而简化的”-写“除了通过引用传递的对象”并不是在简化。这完全是错误的。JavaScript按值传递所有内容,包括对象引用的值。通过引用传递意味着传递对变量本身的引用,以便可以更改变量本身。这与向对象传递引用不同。请参见例如和,该方法的返回值是错误的。它应该是
节点
,而不是
无效
。当然……删除了有问题的单词。解决方案本身保持不变编辑:oops忘记更新返回类型