C# 入門 & 実践 / C sharp
3-19. 構造体( struct ) とクラス( class )の違い。
構造体は、軽量だそうです。
構造体=値型
クラス=参照型
構造体が、ボックス化を多用する以外は、構造体のほうが軽い。
・コンストラクタが引数を持たなければいけない。
・インスタンス部分で値を変数に初期化代入できない。
値型と参照型の違いを見てみましょう。
class Hello
{
private int x = 0;
public Hello()
{
}
public Hello( int x )
{
this.x = x;
}
public int X
{
get { return x; }
set { x = value; }
}
}
class Tester
{
static public void ChangeX(Hello h)
{
h.X = 100;
}
static void Main(string[] args)
{
Hello h = new Hello( 1 );
ChangeX(h);
Console.WriteLine("x = {0}",h.X );
}
}
この結果は参照型のため、渡したクラス自体の値がかわります。
1: x = 100
2: x = 100
となります。
// 構造体バージョン!
struct Hello
{
// ここで変数の初期化は出来ない!
// private int x = 0;
private int x;
// 引数の無いコンストラクタは使用できない!
//public Hello()
//{
//}
public Hello( int x )
{
this.x = x;
}
public int X
{
get { return x; }
set { x = value; }
}
}
class Tester
{
static public void ChangeX(Hello h)
{
h.X = 100;
Console.WriteLine("1: x = {0}", h.X);
}
static void Main(string[] args)
{
Hello h = new Hello( 1 );
ChangeX(h);
Console.WriteLine("2: x = {0}",h.X );
}
}
値型のため!ChangeX 内では 100 だが、元の Main のなかは 1 のまま
1: x = 100
2: x = 1
試しに ref 参照渡しをしてみる。
struct Hello
{
// ここで変数の初期化は出来ない!
// private int x = 0;
private int x;
// 引数の無いコンストラクタは使用できない!
//public Hello()
//{
//}
public Hello(int x)
{
this.x = x;
}
public int X
{
get { return x; }
set { x = value; }
}
}
class Tester
{
// ref をつけて参照渡しを明記
static public void ChangeX(ref Hello h)
{
h.X = 100;
Console.WriteLine("1: x = {0}", h.X);
}
static void Main(string[] args)
{
Hello h = new Hello(1);
// ref をつけて参照渡しを明記
ChangeX(ref h);
Console.WriteLine("2: x = {0}", h.X);
}
}
当然の結果^-^。
1: x = 100
2: x = 100
あとは使い分けですね。それが難しいところですが。
構造体は、値、クラスは、クラス。って意味なんですよね・・・
3-18. 変換演算子(キャスト)オーバーロード / implicit / explicit «
3. C# 入門 / 基礎、型、文法、基本? »
3-20. Interface / インターフェイスの実装
C# 入門 & 実践 / C sharp