型
最終更新:
atachi
-
view
型の種類
リテラル
数値リテラル
int x = 10;
uint ul = 10U; //符号なしの整数リテラルは「U」をつける
long m = 2591L; // long型の整数リテラルは「L」をつける
ulong = 3712UL; // 「U+L」、符号なしのlong
数値の表現方法は次の通り。
int dec = 10; // 10進数表記
int hex = 0x0A; // 16進数表記
文字リテラル [#l02b89d5]
文字と文字列は別物です。C#では文字リテラルは2バイトデータとして扱われ「'(シングルクオーテーション)」で囲う。
char c = 'a';
文字列リテラル
C#では文字列リテラルは「"(ダブルクオーテーション)」を使用するか、@-quoted形式で定義する。
string s = "文字列です"; // ダブルクオーテーション
string path = @"C:\windows\system"; // @-quoted形式
@-quoted形式で文字列リテラルを定義すると、通常ならエスケープシーケンスとなる「\」をそのまま使用することができる。
また、次のように複数行に渡って文字列を定義することができ、改行コードなどの制御コードも含めた文字列リテラルを定義できる。
また、次のように複数行に渡って文字列を定義することができ、改行コードなどの制御コードも含めた文字列リテラルを定義できる。
// 複数行の文字列
string multi =
@"@-quoted string では、
文章を複数行に渡って書くことができます。";
配列
配列の作成には、予め配列のサイズを指定しておく方法と初期データを与えてサイズの設定と初期値の両方を設定する方法がある。
int[] array = new int[5]; // サイズのみを指定して作成
int[] array = new int[] { 1, 2, 3}; // 初期値を指定して作成
// arrayの配列長は、自動的に「3」となる。
配列の要素にアクセスする場合は添字を使用する。添字は数値リテラルと変数によって指定できる。
int[] array = new int[] { 1, 2, 3};
int val1 = array[0]; // val1 = 1
int pos = 2; // 添字に変数を使用する
int val2 = array[pos]; // val2 = 3
配列の配列長を取得するにはLengthプロパティへアクセスする。
int[] array = new int[] { 1, 2, 3};
int len = array.Length; // len = 3
四角い多次元配列
C++やJavaにはない多次元配列で、アクセス方法が次のように添字を指定して各要素にアクセスできます。
// 初期化
int[,] 2di = new int[,]{
{0,0},{0,1},{0,2},
{1,0},{1,1},{1,2}
{2,0},{2,1},{2,2}
};
int[,] d = 2di[1,0]; // dには1つの要素を持った四角い多次元配列
int[,] 2d; // 二次元配列の変数
int[,,] 3d; // 三次元配列の変数
int[,] 2de = new int[10,10]; // 10×10の四角い配列
int[,,] 3de = new int[10,10,10]; // 10×10×10の四角い立体的な配列
// 初期化
int[,] 2di = new int[,]{
{0,0},{0,1},{0,2},
{1,0},{1,1},{1,2}
{2,0},{2,1},{2,2}
};
配列内の配列による多次元配列
C++やJavaで実装されている多次元配列で、配列内に配列が入っているイメージ。
ind[][] 2d = new int[10][10]; // 10×10の配列だが、イメージとしては配列の中に配列が入っているイメージ
int[][] 2di = new int[][] {
new int[] {1,2,3},
new int[] {1,2,3},
new int[] [1,2,3}
}
定数
constキーワードをつける。
null許容型
class NullableExample
{
static void Main()
{
int? num = null;
if (num.HasValue == true)
{
System.Console.WriteLine("num = " + num.Value);
}
else
{
System.Console.WriteLine("num = Null");
}
// y is set to zero
int y = num.GetValueOrDefault();
// num.Value throws an InvalidOperationException if num.HasValue is false
try
{
y = num.Value;
}
catch (System.InvalidOperationException e)
{
System.Console.WriteLine(e.Message);
}
}
}
型推論変数
C#3からはVisualBasicなどのように変数の型をコンパイラに推論させる変数を定義できる。
var name = "Personal Name";
var age = 19;
// nameはstring型
// ageはint型
また、型推論変数は必ず値の初期化と共に定義しなければならない。
dynamic変数
C#4からは型推論変数によく似たdynamic変数を実装しました。
型推論変数はコンパイラがコンパイル時に型を予測し、データに基づいて正しい型に変換してILを作成することに対し、dynamic変数は型の予測は一切行わず、ランタイムまでdynamic型の変数として認識します。
var age = 18; // ageはコンパイル時には「int型」
dynamic name = "Personal Name"; // nameはコンパイル時には「dynamic型」
dynamic型を使用すると何ができるかというと、下記のようなコードを記述できます。~
これは型の定義がコンパイル時ではなく、ランタイムで解決されるためです。
これは型の定義がコンパイル時ではなく、ランタイムで解決されるためです。
dynamic name = "Person Name";
name.UpperCase();
name変数の中身はstring型で、「name.UpperCase()」のようなUpperCase()メソッドの呼び出しは、dynamic型によって内部データ型へプロキシされます(string.UpperCase()が呼び出される)
もし、string型にUpperCaseメソッドが定義されていない場合は、ランタイムで例外が発生します。~
強い型定義変数や型推論変数では、メソッドが定義されていない場合のエラーはコンパイル時に知ることができましたが、dynamic変数を使用した場合、ランタイムまでこの問題が表面化しません。そのため、運用には注意が必要となります。
強い型定義変数や型推論変数では、メソッドが定義されていない場合のエラーはコンパイル時に知ることができましたが、dynamic変数を使用した場合、ランタイムまでこの問題が表面化しません。そのため、運用には注意が必要となります。