背景
これまでJavaをメインに仕事してきたのですが、ほとんど触れてこなかったC#を仕事で使うことになったので勉強しました。
似ているところもありますが、思想の違いや微妙な書き方の違いがあるので「これどう書くんだっけ?」が絶対に起きると思いましたので、よく使いそうなところをピックアップしてチートシートとしてまとめてみました。
細かいところは追々知っていこうと思います。
使用するパッケージの宣言
Java
呼び出し方が違う。
importjava.util.ArrayList;C#
usingSystem.Collections.Generic;パッケージの定義
宣言が違う。
また思想も違うのでネーミングは注意。
Java
packageStudyPackage.com.anyplusC#
namespaceStudyPackage// 思想が違うためドメインがないアクセス修飾子
Javaにはないinternalやprotected internalが存在する。
同じ修飾子でも思想の違いによることでアクセス可能範囲が異なる事にも注意。
| 修飾子 | Java | C# |
|---|---|---|
| public | どこからでもアクセス可能 | どこからでもアクセス可能 |
| protected | 同一のパッケージ、または派生したクラスからアクセス可能 | 派生したクラスからアクセス可能 |
| internal | 存在しない | 同一のアセンブリ(DLL)内でアクセス可能 |
| protected internal | 存在しない | 同一のアセンブリ(DLL)内、または格納しているクラスから派生した型からのみアクセス可能 |
| private | 同じクラス内からのみアクセス可能 | 同じクラス内からのみアクセス可能 |
| 指定なし (default) | 同一のパッケージ内でアクセスが可能 | privateと同じ扱い |
同一のアセンブリ(DLL)とは
同一アセンブリとは、同一のexeファイルや、DLLファイルの事。
VisualStudioのソリューション内であれば、同一プロジェクトということらしい。
継承
継承するときは:(コロン)を使用する。
オーバーライドさせたいメソッドにはvirtualを付け、オーバーライドする時はoverrideをつける。virtualとoverrideを付けないと、インスタンスが生成されて利用可能状態となる。
オーバーライドしたくない時はnewをつける。
Java
classBase{publicvoidprintStr1(){System.out.println("Baseの1です");}publicvoidprintStr2(){System.out.println("Baseの2です");}}classSubAextendsBase{publicfinalvoidprintStr1(){System.out.println("SubAのprintStr1です");}publicvoidprintStr2(){System.out.println("SubAのprintStr2です");}}C#
classBase{publicvoidprintStr1(){Console.WriteLine("Baseの1です");}publicvirtualvoidprintStr2(){Console.WriteLine("Baseの2です");}}classSubA:Base{publicnewvoidprintStr1(){Console.WriteLine("SubAのprintStr1です");}publicoverridevoidprintStr2(){Console.WriteLine("SubAのprintStr2です");}}if文
違いなし。
Stringの比較は等値演算子でも値比較可能という違いがある。
Java
StringstrVal="";if("str".equals(strVal)){System.out.println("同じだよ");}else{System.out.println("違うよ");}C#
stringstrVal="";if("str"==strVal){// 補足Console.WriteLine("同じだよ");}else{Console.WriteLine("違うよ");}補足
String型を参照型なのでJavaでは等値演算子で比較すると同じインスタンスを参照しているかの比較になるが、C#の場合は裏でstring.equalsを呼び出しているためこの書き方でも値の比較が可能。
ただしstring.equalsメソッドには比較方法の指定が可能となるため、コードを書く時はstring.equalsメソッドが無難と思われる。
参照→String.Equalsメソッド - .NET Tips|dobon.net
switch文
違いなし
Java
intmonth=7;switch(month){case1:case2:case3:System.out.println("1Q");break;case4:case5:case6:System.out.println("2Q");break;case7:case8:case9:System.out.println("3Q");break;case10:case11:case12:System.out.println("4Q");break;default:System.out.println("不正な値です。");break;}C#
intmonth=7;switch(month){case1:case2:case3:Console.WriteLine("1Q");break;case4:case5:case6:Console.WriteLine("2Q");break;case7:case8:case9:Console.WriteLine("3Q");break;case10:case11:case12:Console.WriteLine("4Q");break;default:Console.WriteLine("不正な値です。");break;}for文
Javaの拡張for文はC#ではforeachとなる。
Java
for(inti=0;i<=10;i++){System.out.println(str);}String[]strArgs={"1","2"};for(Stringstr:strArgs){System.out.println(str);}C#
for(inti=0;i<=10;i++){Console.WriteLine(str);}string[]strArgs={"1","2"};foreach(stringstrinstrArgs){Console.WriteLine(str);}while文
前判定、後判定共に違いなし。
Java
inti=0;while(i<5){System.out.println(i);//0,1,2,3,4が出力されるi++;}do{System.out.println(i);//0,1,2,3,4が出力されるi++;}while(i<5);C#
inti=0;while(i<5){Console.WriteLine(i);//0,1,2,3,4が出力されるi++;}do{Console.WriteLine(i);//0,1,2,3,4が出力されるi++;}while(i<5);