C#程序员的高级Java主题

时间:2010-09-29 08:19:30

标签: c# java pass-by-reference

我是一名编写Java(适用于Android)的C#程序员,并且有一些Java的技术细节,我仍然不确定,并担心我会从C#角度接近:

  • 方法中的参数是否以与C#相同的方式传递? (复制参考类型)
  • 为什么突然出现@Override属性(我认为它是Java 1.5 +?)
  • 如果您缺少某个正在使用的库的依赖项,如何编译应用程序?
  • 我是否需要担心使用+ =进行大字符串连接(例如使用StringBuilder)
  • Java是否有运算符重载:我应该默认使用equals()还是==。基本上是object.equals与C#(值类型的反射,引用类型的地址引用)大致相同

3 个答案:

答案 0 :(得分:10)

按顺序回答:

  • 是的,参数总是通过Java中的值传递。这包括被复制的引用(而不是对象被复制)。请注意,Java没有任何等效的refout
  • @Override允许您在编译时捕获拼写错误,就像C#中的“覆盖”修饰符一样
  • 您只针对您正在使用的库编译应用程序。没有传递依赖性检查,就像.NET中没有。
  • 是的,你应该避免在循环中连接字符串,就像在.NET中一样。单语句连接很好,就像在.NET中一样 - 再次,编译器将在编译时执行常量表达式的连接,并且字符串文字被实现。
  • 不,Java没有用户定义的运算符重载。 Java中没有自定义值类型; ==始终比较原始值或引用。 (如果你比较一个Object引用和一个原始值,就会涉及自动装箱/拆箱,而我永远不会记得这种方式可行。尽管如此,这是一个坏主意,IMO。)

答案 1 :(得分:4)

  

是否传入方法中的参数   和C#一样吗? (复制   参考类型)

复制所有主要类型,所有对象实际上是指向对象的指针,指针被复制,但实际对象不会被复制。

  

为什么有@Override属性   突然出现(我认为这是Java   1.5 +?)

它没有,因为Java 1.6你也可以使用它来显示一个方法正在实现一个接口。 @Override允许你向编译器表明你认为你正在覆盖一个方法,编译器会在你没有的时候发出警告(实际上这非常有用,特别是如果超类更改的话)

  

如何编译   申请,如果你错过了   其中一个库的依赖关系   你在用吗?

我认为不是。

  

我是否需要担心使用+ =   大字符串连接(例如使用a   而不是StringBuilder

在某些情况下。 java编译器+ VM非常适合自动使用StringBuilder。然而,它并不总是这样做。我不会事先优化这个(或任何东西)。

  

Java是否有运算符重载:   我应该使用equals()或== by   默认。基本上是object.equals   与C#大致相同(反射为   值类型,地址参考   参考类型)

不,它没有运营商重载。

答案 2 :(得分:0)

关于字符串连接我认为这取决于您是否一起添加静态字符串或者是否连接变量。使用变量,最好使用StringBuilder。 :)

所以:

String s = "A";
s += "B";
s += "C";

很好。

但是这里使用StringBuilder更好

String s = "A";
s += variable_b;
s += variable_c;