配列
C#では、配列の宣言と実体の生成方法が何通りかある。このうち、最も使い勝手が良いのは「var x = new[] {1,2,3,};」という記法らしい。
using System; namespace Sample { class Program { static void Main(string[] args) { char[] charArray; // 配列の宣言 char[] twoChar = new Char[2]; // 配列の実体を生成 var threeChar = new Char[3]; // 配列の宣言と実体の生成を同時に行う var x = new int[] { 1, 2, 3, }; // 要素内容を指定して配列の宣言と実体の生成を同時に行う var y = new[] { 1, 2, 3, }; // 要素内容を指定して配列の宣言と実体の生成を同時に行う(要素の型を省略) int[] z = { 1, 2, 3, }; // 要素内容を指定して配列の宣言と実体の生成を同時に行う(要素の型を明示) // 配列の配列 var multiple = new[] { new[] { 1, 2,}, new[] { 3, 4, 5}, }; // 多次元配列 int[,] rect = { { 1, 2, 3, }, { 4, 5, 6, }, }; Console.WriteLine(rect[1, 2]); // 2行目で3番目の数字「6」が表示される } } }
C#の配列は、作成時に与えた長さから変化しない。要素の追加・削除などを行い、途中で長さを変えたい場合には、List<t>クラスを利用する。
列挙型
曜日や月のように、特定の値しかとらないデータを表現するには、列挙型(enumeration type)を使うと便利。
enum DayOfWeek
{
Mon, Tue, Wed, Thu, Fri, Sat, Sun
}
列挙型の値は内部では整数として扱われており、上記DayOfWeek型であれば、Monが0、Tueが1、となる。列挙型の値を明示的に指定することもできる。
enum Month : byte
{
Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
}
上記Month型では、それぞれの値はbyte型となり、Janが1、以降はFebが2、となる。
関数オーバーロード
同じ名前で引数の異なる関数を定義できる。
using System;
namespace Sample
{
class Program
{
static void WriteValueAndType(int n)
{
Console.WriteLine("整数: {0}", n);
}
static void WriteValueAndType(char s)
{
Console.WriteLine("文字: {0}", s);
}
static void Main(string[] args)
{
WriteValueAndType(1);
WriteValueAndType('1');
}
}
}
可変長引数
C#では、paramsキーワードを使うことで可変長引数を使うことができる。
using System;
namespace Sample
{
class Program
{
static int Max(params int[] a)
{
int max = a[0];
for (int i = 1, l = a.Length; i < l; i++)
{
if (max < a[i])
{
max = a[i];
}
}
return max;
}
static void Main(string[] args)
{
Console.WriteLine(Max(1, 2)); // 2
Console.WriteLine(Max(1, 2, 3)); // 3
}
}
}
オプション引数・名前付き引数
C#4.0以上では、オプション引数(省略可能な引数)と名前付き引数を使うことができる。なお、C#4.0に対応するのは、.NET Framework 4.0、Visual Studio 2010。やや古めの環境では対応していないので注意が必要。
using System;
namespace Sample
{
class Program
{
static int calculateEquation(int x, int a = 0, int b = 0)
{
return a * x + b;
}
static uint calculateVolume(uint length, uint width, uint depth)
{
return length * width * depth;
}
static void Main(string[] args)
{
Console.WriteLine(calculateEquation(1, 2));
Console.WriteLine(calculateVolume(length: 1, width: 2, depth: 3));
}
}
}
名前空間のエイリアスと、エイリアス修飾子
名前空間のエイリアスを使うと、任意の名前でクラスにアクセスすることができる。このとき、エイリアスが同一名前空間内で定義されている別クラスと名前が衝突する可能性がある。名前の衝突を回避する方法として、エイリアス修飾子(::)がある。
using System;
namespace Ryo511.Test.Utilities
{
class Image { };
}
namespace Sample
{
using Util = Ryo511.Test.Utilities;
class Util { }
class Program
{
static void Main(string[] args)
{
// Sample.Util なのか Utilitiesのエイリアスなのか不明なのでコンパイルエラー
//Util.Image img = new Util.Image();
// エイリアス修飾子「::」を使うことで、UtilはUtilitiesのエイリアスだと教える
Util::Image img = new Util::Image();
}
}
}