質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

Q&A

解決済

1回答

2026閲覧

classとstructの違い

alma4312

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

0グッド

0クリップ

投稿2015/10/16 01:46

###前提・実現したいこと
classとstructで実装した場合の違いが知りたい。
参照型、値型という違いが起こしている例外処理なきがするが、
structをclassへ変えた時例外処理が発生する理由がわからないので知りたいです。
よろしくお願いいたします。

###発生している問題・エラーメッセージ
tri.a.x = double.Parse(this.textBox1.Text);
例外処理、System.NullReferenceException

###ソースコード
C#

class Point → struct Point へ変更すると正しく動くが、
なぜclassだとだめなのか

namespace triangle3
{
class Point
{
/* x, y 座標を格納する */
public double x;
public double y;

public int int_sum() { int sum = (int)x + (int)y; return sum; } } class triangle { public Point a; public Point b; public Point c; public Point gravity() { /* 3つの座標から重点を求める */ Point gravi = new Point(); gravi.x = (a.x + b.x + c.x) / 3; gravi.y = (a.y + b.y + c.y) / 3; return gravi; } } public partial class Form1 : Form { public Form1() { InitializeComponent(); } /* 画面で、3つの座標を入力した後ボタンを押した時 */ public void Click_btn_event( Object sender, EventArgs e) { triangle tri = new triangle(); try { tri.a.x = double.Parse(this.textBox1.Text); tri.a.y = double.Parse(this.textBox2.Text); tri.b.x = double.Parse(this.textBox3.Text); tri.b.y = double.Parse(this.textBox4.Text); tri.c.x = double.Parse(this.textBox5.Text); tri.c.y = double.Parse(this.textBox6.Text); } catch (FormatException) { return; } Point result = new Point(); result = tri.gravity(); MessageBox.Show(string.Format("( {0} , {1} )", result.x.ToString(), result.y.ToString())); } }

}

###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

triangle tri = new triangle()

これにてtriは初期化して実態が存在していますが、

tri.a.x = double.Parse(this.textBox1.Text);

これの、tri.aは初期化していないため、実態が存在しません。
存在しないが故に、その先のxに値をセットしようとしてもNull〜で落ちます。

クラスの構造を見ていると、
triangleクラスのコンストラクタの中で、
Point a
Point b
Point c
を初期化したらいいかと思います。

ex) Point a = new Point();

投稿2015/10/16 01:59

Ruizi_Luigi

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/10/16 02:01

補足すると、構造体(struct)の場合はPoint a の定義のみで暗黙的に初期化されます。classの場合はRuizi_Luigiさんが仰っているように明示的なインスタンス作成が必要です。
Ruizi_Luigi

2015/10/16 02:21

> Tak1wa さん 補足ありがとうございます。それを記述しておいたほうがよかったですね。
alma4312

2015/10/16 02:27

なるほど classとstructの違いについて把握することができました。 structとclassで”Point a” では意味合いが異なってくるんですね。 Ruizi_Luigiさん Tak1waさん ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問