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
for (int i : intArray) { }
のようにfor文をつかって実現可
isとas
C#には両方あり、C++にはどちらもなく、Javaにはasがありisのかわりにintanceofがある。
lock
同時に複数スレッドの実行を許さない。
C++にはない、Javaあsynchronizedを使う。
C#はlockステートメントがMonitorクラスを使って実装されるがJavaではJVMの機能として実装される。
とりあえずこんなところかな。今日のところはこれまでにしておきます