C++やJavaから見るC#

既にC++やJavaの経験がある方向けに、C#はどのように違うのか説明しようと思います。 さらっと読みたい方にオススメです。

普通の記事が読みたいならC Sharp -Wikipediaでも見てればいいじゃない。

変数

変数には大きく分けて2種類あります。

値型

Javaでいうプリミティブ型にあたります。値型はスタックに積まれます。 値型にはお馴染みのbyte, sbyte, char, short, ushort, int, uint, long, ulong, float, double, bool. (enum) があります。先頭にuがついてるのはunsignedです。128ビットのdecimalとう型もあります。 28桁までの整数を誤差なしで格納できるのでお金を扱うようなものに便利かもしれません。

またJavaは自分でプリミティブな型を定義することは出来ませんでしたが C#では構造体(struct)を使うことによって自分で値型を定義することが出来ます。

参照型

参照型は値型以外です。オブジェクトへの参照情報を持つ型になります。

名前空間

C#での名前空間は完全に理論的な空間名になります。JavaやC++のように実際のファイル構造とは関係ありません。1ファイルに複数のクラスや名前空間があってもかまいません。 名前空間の記述は以下のように行います。

namespace hoge
{
 ほにゃらら贈ォ
}

名前空間はネストすることも出来ます。また.で階層を区切る事も可能です。

Usingディレクティブ

JavaのImport、C++のUsing namespaceと同様の機能としてUsingがあります。

using hoge.hoge;

switch

C#のswitchはbreakを絶対に書かないといけません。つまりフォースルーはできません。ちなみにC#ではstring型の値を使って分岐が出来ます

string mes = Console.ReadLine();

switch (mes)
{
	case "ぬるぽ":
		Console.WriteLine("ガッ");
		break;

	default:
		break;
}

継承

継承は単一継承です。C++と違い多重継承は禁止です。その代わりインターフェースはいくつでも継承することが出来ます。

public class hoge : foo ,Iber ,Iber2 ,Iber3 {}

継承はクラス名のあとに:で区切って継承するクラスを書きます。また,で区切って複数のインターフェースを書くことが出来ます。

プロパティ

いわゆるアクセッサです。C#ではこのアクセッサが言語レベルでサポートされています。 プロパティはクラス内部からは関数のように扱え、クラスの外からは変数のように見えます。 getとsetを定義でき、getだけ書くと読み出し専用プロパティとなり、代入は出来ないようにできます。

private int hoge = 0;

public int Hoge
{
	get 
	{
		return this.hoge;
	}

	set 
	{
		if(this.hoge > -10)
			this.hoge = value;
	}
}

代入された値はvalueに入ります。この時、値のチェックなどができます。

ポインタ

C#ではポインタを使用することが出来ます。ただしポインタ使うならC++使った方がいいです。 ポインタを使うには、unsafeコンテキストで囲う必要があります。unsafeというくらいですから使わない方がいいです。

unsafe
{
	//この中でのみポインタ使用可
}

参照渡し

値型を参照渡ししたい場合や、DLLの呼び出し、XNAなどでよく使われます。

ref

参照渡しをしたい場合refキーワードを用います。refと書く事で参照渡しであることを認識させ、間違いを防ぐためです。

hoge(ref foo);

と書けます。

out

また結果を受け取る為の変数専用にoutも用意されています。

 hoge(ref foo, out result);

resultは初期化しなくてもかまいません。この場合hogeという関数を実行するとresultに結果が入ることになります。