お疲れ様です。たなしょです。
今日は配列などのデータ構造や名前空間などの構造化について学びました。
この辺からC#特有の文法が出てきて面白かったです。
配列
今まで学んだ言語と同じなのでここも記載は割愛します。
配列→多次元配列→ジャグ配列の流れはどの入門書でも定番の流れですね。
クラス、メンバー、enum
ここもJavaと同じなので記載は割愛します。
マイクロソフトが作ったJavaと言われているだけあってこの辺の記載はJavaと似ていました。
後一点気になったのが、
enum 年号
{
明治, 大正, 昭和, 平成, 令和
}
C#は日本語を正常に読み解てくれるんですね。
2バイト文字だと文字化けが怖いのでNENGO
にして中の値もmeiji
に変更したほうがいいと思うんですけど…。
タプル
分解と組み合わせるとスワップが簡単にできるのは確かに便利だなと思いました。
static void Main()
{
int a = 10, b = 20;
(a, b) = (b, a);
Console.WriteLine($"{a} {b}");
}
それ以外は目新しい文法は特になかったです。
if, switch, goto
どの言語でも共通している部分が多いので記載は割愛します。
goto文は極力使ってはいけませんよーというのはどの言語でも常套句です。(プロジェクトのコーディング規約でも「gotoは使用禁止」と記載があるんですよね。)
僕がgoto文を使ったのはC言語でOSかコンパイラを作った時ぐらいですかね。
while, do~while, for, foreach
どの言語でも共通している部分が多いので記載は割愛します。
foreach文をまともに使えるようになったのはPHPを書き始めた時です。for文でしこしこ配列の値を取得していたらレビューで全て指摘対象になり、泣く泣く修正しました。いい思い出です。
可変長引数(パラメーター配列)
これはすごく便利だなと思いました。
普通なら一旦配列に値を代入しないといけないです。
static void Main()
{
int a = 1, b = 2, c = 3, d = 4, e = 5;
int[] tmp = new int[] { a, b, c, d, e };
int max = Max(tmp);
}
static int Max(int[] a)
{
int max = a[0];
for(int i=1; i<a.Length; i++)
{
if (max < a[i])
max = a[i];
}
return max;
}
可変長引数(パラメーター配列)を使うと配列を宣言しなくて済むので、可読性が上がりそうです。
static void Main()
{
int a = 1, b = 2, c = 3, d = 4, e = 5;
int max = Max(a, b, c, d, e);
Console.WriteLine($"{max}");
}
static int Max(params int[] a)
{
int max = a[0];
for (int i = 1; i<a.Length; i++)
{
if(max < a[i])
max = a[i];
}
return max;
}
名前付き引数
本来関数の引数を変更するときは、直前で宣言した変数に値を代入します。
int i = 0;
// 返り値で4が欲しい
i = 2;
int sq = Square(i);
static int Square(int a)
{
return a * a;
}
名前付き引数を使えば関数の直前で代入しなくても問題ありません。
i: 2
のように使います。
```c#
int i = 0;
// 返り値で4が欲しい
int sq = Square(i: 2);
static int Square(int a)
{
return a * a;
}
例外処理
こんな風にcatch文を記載できるんですね。Javaでもできるんですかね?
catch (Exception e) when (e is FormatException || e is DivideByZeroException)
上記のように書くとFormatException
とDivideByZeroException
ときにcatch文の処理に入ります。
それ以外は特に目新しい項目がないので記載は割愛します。
久しぶりにtry-catch-finally文を書きました。PHPだとDB処理の部分でしかtry文を書かないんですよね。
名前空間
C#でよくみるnamespace
についてです。
本の最初の方に「ディレクトリのようなもの」と書かれていましたがまさにその通りでした。
namespaceを定義することでこの中にあるclassなどは定義したnamespaceに属します。
エイリアスを付けられるみたいなのですが、いまいち内容がわかりません。
定数
ここも既知などで記載は割愛します。
最近Go言語でCLIツールをよく書くのですが、そこでもがっつり定数を使ってます。大事ですね。
ソースコードが見やすくなります。
最後に
色々とソースコードを写経したことで簡単CLIツールなら作れるぐらいにはコードが書けるようになりました。
条件分岐なども一通り学んだのでこれでAtcoderにも参加できますね!
明日も引き続きよろしくお願いします。