Javaと似てるC#の使い方。Javaとの違いは何?

JavaとC#といえばどちらも主要なオブジェクト指向言語のひとつと言えます。この二つの言語は一見するとよく似ているため、Javaを学んだことがある人からするとC#の習得は楽に思えるかもしれません。しかし、二つの言語の機能を比較してみると、実は大きな違いがいくつか存在しています。本稿ではJavaとC#は何が違うのか、比較しながら解説していきます。

JavaとC#の違いとは?


JavaとC#は基本的な文法の面などでは共通点が多くみられますが、実際にどんな違いがあるのでしょうか?学んでいく上で重要なポイントとなる6つの項目について見ていきましょう。

オブジェクトの扱い

どちらの言語もオブジェクト指向であり、クラス単位での記述が基本です。作成したクラスをインスタンス化してオブジェクトを生成し、そのオブジェクトのメンバーを利用していくという部分はJava、C#でも共通しています。さらに2言語ともガベージコレクションの機能があるので、new演算子で領域を確保したあと手動でメモリを解放しなくてもいい、という点も同じです。

ただし、C#はJavaと違って限定的ではありますがポインタを使用することができます。ポインタを使うときは、ポインタを使うメソッドの宣言に”unsafe”と付けることで、そのメソッド内に限って使用可能になります。しかしポインタは安全ではなく、意図しないトラブルの原因になりやすいことから、実際のプログラミングで使用されることはほとんどありません。

データ型

Java、C#ともに値型と参照型の概念がありますが、C#では構造体や列挙型を扱うことできるため、独自の値型を定義することもできます。C#で独自型を定義する際は必要に応じて使い分けるといいでしょう。

また、C#は値型も参照型も元を辿るとobject型から派生しています。そのためJavaのようにラッパークラスを使わなくても、object型の引数へ直接代入することなどが可能です。

配列

C#では多次元配列を使用することができます。Javaにおいても他の言語と同じように「配列の配列」とすることで疑似的な多次元配列を扱うことはできますが、処理速度に影響が出てしまいます。

例えば、C#でint型の3×2の2次元配列を生成する場合は以下のように書くことができます。

int[,] array = new int[3,2];

内部クラス

Javaにおける内部クラスはstaticか、もしくは非staticかによって機能が大きく異なるので区別しなければなりません。正確にはstaticなクラスは「静的入れ子クラス」、非staticなクラスを「内部クラス」と呼びます。

内部クラスは外側のクラスの非staticなメンバーへアクセスが可能ですが、静的入れ子クラスはstaticなメンバーしかアクセスできません。C#には前述の内部クラスは存在しないため、外側クラスのメンバーを扱うにはコンストラクタに値を渡す必要があります。

メソッド

通常のメソッドの構文はJavaとC#ではほとんど変わりません。ただし多態性を利用する場合とメソッドをオーバーライドするときは明示的に示さなければなりません。Javaは特に何もしなくてもオーバーライドしたりすることは可能ですが、C#の場合、以下のように修飾子を記述します。

多態性を利用する場合
public virtual int Sample(int x, int y) { return x + y; }

オーバーライドする場合
public override int Sample(int x, int y) { return x * y; }

C#では上記のようにvirtual修飾子をつけたメソッドを「仮想メソッド」と呼び、オーバーライドするには対象が仮想メソッドである必要があります。

例外処理

try-catch文やthrow文など、基本的な構文はほぼ同じですが、「何を例外として扱うか」という点では大きく異なってきます。Javaでは例外を「検査例外」と「非検査例外」の二つに大別できます。検査例外に分類されるもの(例えばIOExceptionなど)はtry-catch文でキャッチするか、throws句を用いて例外を呼び出し元へ投げる必要があり、これらの例外に対する処理が書かれてなければコンパイルエラーとなります。

一方C#で扱う例外は、基本的にJavaで言う非検査例外(NullPointerExceptionなど)にあたり、検査例外にあたるものは返値として扱うため、Javaとは違ったアプローチでコーディングしていく必要があります。

C#でJavaScriptを呼び出す方法


Javaには標準機能としてJavaScriptを実行させることができますが、C#にも同じようにJavaScriptとの連携機能は備わっています。.NET Frameworkのライブラリの中に「System.Windows.Browser」という名前空間があり、JavaScriptとやり取りするための様々な機能を持っています。これらの機能はSilverlightアプリケーションを作成する際に使用可能です。

例えばC#からJavaScriptの関数を呼び出したい場合は、HtmlPageクラスのWindowプロパティからHtmlWindowオブジェクトを取得します。HtmlWindowオブジェクトにはJavaScriptの関数を呼び出すInvokeメソッドが用意されているので、こちらのメソッドからJavaScriptの関数を指定して呼び出すことができます。

C#とJavaが似てる?


C#とJavaはどちらもC++をベースとしており、C#も登場当初はJavaを参考にしていました。どちらの言語もC++から複雑さを排除してプログラマの負担を軽減させること、そしてどんな環境でも同一のコードで動作させるという共通の目的があります。二つの言語仕様がよく似ているのはこうした背景があるためです。

しかし、C#とJavaでは設計思想が大きく異なり、Javaでは安全性・複雑さの回避などの観点から廃止された機能が、C#では実行効率を重視するために残されていたりします。加えてC#ではコードの冗長化を避けるために、Javaには存在した機能を減らし、逆に新たに追加された機能も多いです。したがって、C#とJavaはよく似た言語ではありますが、内実全く異なる言語であると言えるでしょう。

まとめ

C#とJavaには今回挙げた機能の他にも多くの違いが存在します。二つの言語は何となく似ているように見えますが、Javaはシンプルに、C#は機能にこだわった言語と言えます。それぞれ設計思想の違いがあるため、基本文法は同じようでもコードの設計の仕方は変わってくることに注意しましょう。Javaを学んだ方がC#を学ぼうとするとかえって混乱してしまう部分もありますが、二つの言語を混在せずに違う言語だと理解して学んでいくことが重要です。

関連記事

ページ上部へ戻る