【问题标题】:Why does this only work when the ref keyword is used?为什么这仅在使用 ref 关键字时才有效?
【发布时间】:2011-11-07 08:26:52
【问题描述】:

我有这个容器类:

class Fruit
{
    public Apple apple;
    public Banana banana;
}

我在另一个类中有一个函数,如下所示:

public void ChangeFruit(Fruit fruit)
{
    fruit.apple = memberApple;
    fruit.banana = memberBanana;
}

而且效果很好。

但是,我想知道为什么这不起作用:

如果我将 ChangeFruit 方法更改为不使用容器,而是使用实际的水果类,如下所示:

public void ChangeFruit(Apple apple, Banana banana)
{
    apple = memberApple;
    banana = memberBanana;
}

那么这不起作用,除非 ref 关键字与每个参数一起传递。为什么这里需要 ref 关键字而不需要那里?

顺便说一下,在调用后者ChangeFruit的时候,我是这样称呼的:

ChangeFruit(myFruit.apple, myFruit.banana);

相对于ChangeFruit(myFruit);

我只想知道在传递容器类时我不需要 ref 关键字,但是当我单独传递每个水果时我需要。无论哪种方式,我都在传递 myFruit,除了在后一个示例中,我只是单独传递其成员变量而不是整个容器。

【问题讨论】:

标签: c# reference ref


【解决方案1】:

当您调用ChangeFruit(myFruit.apple, myFruit.banana); 时,您将传递 Fruit 类中这些属性的引用副本。只有那些副本会在您的函数中被修改。事实上,您所做的是对您的副本添加一个新引用,这不会修改您的原始对象。

当您使用 ref 关键字时,您传递的是对这些类型的引用,而不是副本

但是当你打电话给ChangeFruit(myFruit);。您正在传递容器引用的副本。它指向堆上的同一个对象。而你正在修改它的内容。

【讨论】:

  • 好的,谢谢,我明白了。但是,如果我不想在传递变量时立即修改它怎么办?我怎么能让这样的事情起作用? pastebin.com/8WBHJnj3
  • 不确定我是否正确理解了您的问题。但是在DoSomethingWithApple() 方法中,您正在为您的班级中的apple 字段添加一个新引用。这将在您调用该字段后得到反映方法。
猜你喜欢
  • 2012-05-01
  • 2022-10-26
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
相关资源
最近更新 更多