C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

オブジェクトは参照型、フィールドは値型である説明

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■82321 / inTopicNo.1)  オブジェクトは参照型、フィールドは値型である説明
  
□投稿者/ sasamo (1回)-(2017/01/02(Mon) 07:31:32)

分類:[C#] 

unity(c#)で下記のようなコードがあります。

----------------------------------------------------------
//クラスを定義
using UnityEngine;
using System.Collections;

public class Teigi
{public int i_class = 100;}

-----------------------------------------------------------

//定義したクラスを利用
using UnityEngine;
using System.Collections;

public class Riyou : MonoBehaviour
{
 void Start ()
{
Teigi teigi = new Teigi();
Teigi teigi02 = new Teigi();

teigi = teigi02;
teigi.i_class = 999;

Debug.Log(teigi.i_class);
Debug.Log(teigi02.i_class);
}
}

-----------------------------------------------------------

上記コードの場合は

Debug.Log(teigi.i_class); @
Debug.Log(teigi02.i_class); A
@、A 共に999が出力されます。

しかし

----------------------------------------------------------
//クラスを定義
using UnityEngine;
using System.Collections;

public class Teigi
{public int i_class = 100;}

-----------------------------------------------------------

//定義したクラスを利用
using UnityEngine;
using System.Collections;

public class Riyou : MonoBehaviour
{
 void Start ()
{
Teigi teigi = new Teigi();
Teigi teigi02 = new Teigi();

teigi.i_class = teigi02.i_class;
teigi.i_class = 999;

Debug.Log(teigi.i_class);
Debug.Log(teigi02.i_class);
}
}

-----------------------------------------------------------

上記コードの場合は

Debug.Log(teigi.i_class); @
Debug.Log(teigi02.i_class); A
@で999が出力
Aで100が出力されます

Teigiオブジェクトは参照型ですが
Teigi.i_classフィールド(int)は値型になります。

なぜ、Teigiオブジェクトは参照型で
int型のインスタンスフィールドは値型になるのか?

これがよく分からず困っております。
私のイメージとしてはインスタンスフィールドもオブジェクトに含まれますから
クラスのインスタンスフィールドも参照型になると思っていました。
ですから、かなり困惑しております。

Teigiオブジェクトが参照型
int型のインスタンスフィールドは値型になる理由を教えてください
よろしくお願いいたします。


引用返信 編集キー/
■82322 / inTopicNo.2)  Re[1]:
□投稿者/ Azulean (757回)-(2017/01/02(Mon) 08:10:48)
2017/01/02(Mon) 08:12:58 編集(投稿者)

No82321 (sasamo さん) に返信
> なぜ、Teigiオブジェクトは参照型で
> int型のインスタンスフィールドは値型になるのか?

そのように言語やフレームワークで定義されているからです。


> これがよく分からず困っております。
> 私のイメージとしてはインスタンスフィールドもオブジェクトに含まれますから
> クラスのインスタンスフィールドも参照型になると思っていました。
> ですから、かなり困惑しております。

No82292 で似たような話がありましたが、メモリ上の場所によって値型・参照型の性質が変わるわけではありません。
値型なら「値そのもの」、参照型なら「別のオブジェクトへの参照」がインスタンスフィールドとして保持されていると考えてください。
引用返信 編集キー/
■82345 / inTopicNo.3)  Re[2]: :
□投稿者/ Jitta (247回)-(2017/01/04(Wed) 15:09:27)

> Teigiオブジェクトが参照型
> int型のインスタンスフィールドは値型になる理由を教えてください

「int 型のインスタンスフィールドは値型」というのに違和感。
インスタンスフィールドだから値型ではなく、int型だから値型。
「オブジェクトは参照型、フィールドは値型」ではなく、
参照型はどういうところで使っても参照型。
値型は、どういうところで使っても値型。
引用返信 編集キー/
■82351 / inTopicNo.4)  Re[1]: オブジェクトは参照型、フィールドは値型である説明
□投稿者/ shu (951回)-(2017/01/04(Wed) 17:08:55)
No82321 (sasamo さん) に返信

intを参照型で扱うとメモリ効率が悪いから。
参照型になると実際に値が変数には参照(ポインタのようなもの)が設定され
実際の値は変数に設定されている参照が差す先に入っている状態となり。
1つのintを使うのにアドレス情報+int値を保管する領域が必要となってしまいます。
新しいint値の代入を行う場合も新しいint値が保管される場所が確保されそこへの参照へ
書き換わる事となります。元の値、参照はGC解放待ちとなります。


引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ