C#は静的型付け言語です。つまり、コンパイル時にすべてのものに型が付きます。名前を付けて値を代入することを、変数の定義と呼びます。変数は、型を明示的に指定して定義する方法と、代入する値からC#コンパイラーに型を推論させる方法(これは_型推論_と呼ばれます)のどちらでも定義できます。したがって、次の2つの変数定義は同じ意味になります。
int explicitVar = 10; // Explicitly typed
var implicitVar = 10; // Implicitly typed
変数の値を更新するには、=演算子を使います。一度定義すると、変数の型は変えることができません。
var count = 1; // Assign initial value
count = 2; // Update to new value
// Compiler error when assigning different type
// count = false;
C#はオブジェクト指向言語であり、すべての関数を_クラス_の中で定義する必要があります。クラスを定義するには、classキーワードを使います。オブジェクト(または_インスタンス_)は、newキーワードを使って生成します。
class Calculator
{
// ...
}
var calculator = new Calculator();
クラスの中にある関数は、_メソッド_と呼びます。各メソッドは、0個以上の仮引数を持てます。すべての仮引数には型を明示する必要があり、仮引数には型推論がありません。同様に、戻り値の型も明示する必要があります。メソッドから値を返すには、returnキーワードを使います。ほかのファイルのコードからメソッドを呼び出せるようにするには、publicアクセス修飾子を付ける必要があります。
class Calculator
{
public int Add(int x, int y)
{
return x + y;
}
}
メソッドは、インスタンスに対してドット(.)構文を使って呼び出します。呼び出すメソッド名を指定し、メソッドの各仮引数に対応する引数を渡します。引数には、対応する仮引数の名前を任意で指定できます。
var calculator = new Calculator();
var sum_v1 = calculator.Add(1, 2);
var sum_v2 = calculator.Add(x: 1, y: 2);
C#のスコープは、{と}の文字の間に定義されます。
C#では、2種類のコメントを書けます。1行コメントは//で始め、複数行コメントは/*と*/の間に書きます。
Lucianのガールフレンドが家に帰ってくるというのに、Lucianは記念日のディナーをまだ作っていません!
この演習では、Lucianがお気に入りの料理本のとおりに絶品のラザニアを作れるよう、コードを書いていきます。
タスクは4つあり、どれもラザニアを調理するのにかかる時間に関するものです。
入力を受け取らず、ラザニアをオーブンに入れておくべき分数を返すLasagna.ExpectedMinutesInOven()メソッドを定義します。料理本によると、想定されるオーブン加熱時間は40分です。
var lasagna = new Lasagna();
lasagna.ExpectedMinutesInOven();
// => 40
ラザニアが実際にオーブンに入っていた分数を入力として受け取り、前のタスクで求めた想定加熱時間をもとに、ラザニアをあと何分オーブンに入れておく必要があるかを返すLasagna.RemainingMinutesInOven()メソッドを定義します。
var lasagna = new Lasagna();
lasagna.RemainingMinutesInOven(30);
// => 10
ラザニアに重ねた層の数を入力として受け取り、1層につき2分かかるものとして、ラザニアの準備に何分かかったかを返すLasagna.PreparationTimeInMinutes()メソッドを定義します。
var lasagna = new Lasagna();
lasagna.PreparationTimeInMinutes(2);
// => 4
2つの入力を受け取るLasagna.ElapsedTimeInMinutes()メソッドを定義します。1つ目の入力はラザニアに重ねた層の数で、2つ目の入力はラザニアがオーブンに入っていた分数です。このメソッドは、ラザニアの調理に費やした時間を分単位で返します。それは、準備時間と、その時点までラザニアがオーブンにいた時間を足したものです。
var lasagna = new Lasagna();
lasagna.ElapsedTimeInMinutes(3, 20);
// => 26