C#的ref和Java用的

时间:2010-12-12 19:13:16

标签: java pass-by-reference

正如我们所知,在将参数传递给方法时,两种语言都是按值传递的。但是C#支持refout个关键字来传递基本类型的引用。我在Java中寻找相同的关键字和技术?

我的猜测是在Java中使用Integer包装类而不是int来传入。

有任何建议和例子吗?

6 个答案:

答案 0 :(得分:12)

你的猜测是正确的。需要一个包装器(但不是Integer,因为它是不可变的)。

有些人为此目的使用单个元素数组:

int[] x = { 0 };
int[] y = { 0 };
someMethod(x, y);
return x[0] + y[0];

很多人会用GOTO对那种技术进行排名。

有些人定义了一个通用的持有者类:

public class Holder<T> {
    private T _value;
    private Holder(T value) { _value = value; }
    public static of(T value) { return new Holder<T>(value); }
    public T getValue() { return _value; }
    public void setValue(T value) { _value = value; }
}

...

Holder<String> x = Holder.of("123");
Holder<String> y = Holder.of("456");
someMethod(x, y);
return x.getValue() + y.getValue();

有些人定义了专门建造的类型:

SomeMethodResult result = someMethod(x, y);
return result.getX() + result.getY();

有些人会安排在方法内完成工作,首先避免使用引用参数:

return someMethod(x, y);

这些技术中的每一种都有优点和缺点:

  • 数组:简单与丑陋,依赖于只有一个元素的数组
  • 持有人:安全与详细,拳击
  • 专用类型:安全与详细,可能过度杀伤
  • 改变方法:安全,清洁,而不是总是可能

就个人而言,我认为Java搞砸了这个。我宁愿避免使用引用参数,但我希望Java允许来自方法的多个返回值。但是,说实话,我不经常绊倒这个。我不会为这个功能提供肾脏。 :)

答案 1 :(得分:5)

Java不支持此功能。

答案 2 :(得分:1)

Java不支持通过引用传递基本类型。

int包装为Integer无济于事,因为它是一种不可变类型(即一旦创建就无法更改)。

答案 3 :(得分:1)

Java没有这个内置功能。 Integer不会这样做,因为它是不可变的。你不能改变它的状态。

您必须创建自己的可变包装类。但这非常“危险”并可能导致意外结果,所以尽量避免它。

答案 4 :(得分:1)

传递值的唯一方法是将引用传递给像

这样的可变值
public void calc(int[] value) { value[0] = 1; }
public void calc(AtomicInteger value) { value.set(1); }

然而,最简单的方法是返回所有更改的值

public int calc() { return 1; }

答案 5 :(得分:0)

Java没有此功能

这是Java vs C#比较的链接

http://www.harding.edu/fmccown/java_csharp_comparison.html

这就是为什么他们称Java为非纯OOP语言