korechi’s diary

とあるVR/ARエンジニアのブログ

JavaとC#の違い

自分はメインでC#を使っているのですが、とある理由でJavaもやらないといけなくなったのでまず両者の違いを知る意味も含めて簡単にまとめてみます。(適切ではないかもしれない)

C#とは

オブジェクト指向言語で、マイクロソフトの提唱する.NET Frameworkという実行環境での実行を前提とする。

メモリ管理

.NET Frameworkは自動メモリ管理で、ガベージコレクション(GC)が使われているためメモリを明示的に開放する処理が必要ない。
Javaも同様である。(C++は手動でメモリ管理する必要あり) これは仮想実行環境(VES)で提供される。

C# Java
実行環境 .Net Frameworkなど JRE(Java Runtime Environment)
仮想実行システム CLR(共通言語ランタイム) JVM(Java Virtual Machine)
共通中間言語 CIL バイトコード

アクセス修飾子

修飾子 Java C#
protected 同一のパッケージ、または派生したクラスからアクセスが可能 派生したクラスからアクセスが可能
internal 存在しない 同一のアセンブリ(DLL)内でアクセスが可能
(default) 同一のパッケージ内でアクセスが可能 同じクラス内からのみアクセスが可能(private)

データ構造

変数 C C++ Java
char 1byte 1byte 2byte
short 2byte 2byte 2byte
int 2byte 4byte 4byte
long 4byte 4byte 8byte
float 4byte 4byte 4byte
double 8byte 8byte 8byte
データを保持する場所
値型 スタック上
参照型 ヒープ上

基本構文

メインの書き方が微妙に異なる。
C#:

static void main(string[] args)

c++:

int main (int argc, char* argv[])

java:

public static void main(String[] args)

名前空間

C++: namespace
C#: namespace(.をつけて階層化可) Java: パッケージ(ソースコードを置いてある物理パスの構造がそのまま名前空間に相当する階層。ソースコード中にはパッケージ名を書かない)
ちなみに、名前空間の外をグローバルスコープという。

暗黙的な型指定

C#:

var i = 10; // i はint型になる

C++ではauto

動的型付け

static void Main() {
  Add(1, 2);
  Add("a", "b");
}
static void Add (dynamic x, dynamic y) {
  x = x + y;
}

ローカル定数

constをつければローカル定数を作れる

+演算子

C#では、+演算子を文字列の連結やデリゲートの結合に使える。

フォークスルー

C#でのみ、case文でのフォークスルーが禁止されている。使いたいならgoto文を使う

switch(x) {
  case 0:
    // breakなどを書かないとコンパイルエラー
  case 1:
    goto case 2;
  case 2:
    break;
  default:
    break;
}

※goto はブロック内から外に抜けられるが、逆はできない
Javaにgotoはない(今のところ)

foreach

C++, C#は使えるが、Javaで使いたいなら

for (int i : intArray) {
}

のようにfor文をつかって実現可

isとas

C#には両方あり、C++にはどちらもなく、Javaにはasがありisのかわりにintanceofがある。

lock

同時に複数スレッドの実行を許さない。
C++にはない、Javaあsynchronizedを使う。
C#はlockステートメントがMonitorクラスを使って実装されるがJavaではJVMの機能として実装される。

とりあえずこんなところかな。今日のところはこれまでにしておきます