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

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

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

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

Q&A

解決済

3回答

3710閲覧

コンストラクタとFor文の関係

seri

総合スコア422

C#

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

0グッド

0クリップ

投稿2015/12/30 06:36

このサイト(http://csharp.sevendays-study.com/ex-day2.html)に下記のようなスクリプトがありますが
このスクリプトで少し疑問に思う事があります。。

ーーーーー質問内容ーーーーーーーーーーーーーーーーーーーーーーーーー
program.csのfor文でDateのインスタンスを作成していますが
作成した直後にData.ShowNumber(); が呼び出され
その後にDataクラスのコンストラクタが読み込まれていますよね・・
これってつまり、コンストラクタの読み込み優先順序は、
for文内のブロック式よりも低く、for文1回分のループよりも高い
とゆう解釈でよろしいのでしょうか?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

###プロジェクトSampleEx201/Data.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SampleEx201
{
class Data
{
// Dataオブジェクトの数
private static int num = 0;
// データの値
private int id;
// コンストラクタ(引数つき)
public Data(int id)
{
this.id = id;
num++;
Console.WriteLine("値:{0} 数:{1}", this.id, num);
}
// オブジェクトの数を取得
public static void ShowNumber()
{
Console.WriteLine("Dataオブジェクトの数:{0}", num);
}
}
}
###Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SampleEx201
{
class Program
{
static void Main(string[] args)
{
// Dataクラスを3つ作る
Data[] d = new Data[2];
// Dataのインスタンスの数を表示
Data.ShowNumber();
// 一つ目のインスタンスを生成
for (int i = 0; i < d.Length; i++)
{
d[i] = new Data(i*100);
// Dataのインスタンスを生成
Data.ShowNumber();
}
}
}
}
###実行結果
Dataオブジェクトの数:0
値:0 数:1
Dataオブジェクトの数:1
値:100 数:2
Dataオブジェクトの数:2

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

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

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

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

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

guest

回答3

0

コードについているコメントからして謎の解釈をしているようなので
コメントにコメントしていきます、

C#

1static void Main(string[] args) 2{ 3 // Dataクラスを3つ作る <- 3つではなく2つ、 4 // しかもこの時点ではDataクラスのインスタンスは作っていない。 5 Data[] d = new Data[2]; 6 7 // Dataのインスタンスの数を表示 8 Data.ShowNumber(); 9 10 // 一つ目のインスタンスを生成 <- ??? 11 for (int i = 0; i < d.Length; i++) 12 { 13 // Dataのインスタンスを生成 14 d[i] = new Data(i*100); 15 16 // Dataのインスタンスを生成 <- ??? 17 Data.ShowNumber(); 18 } 19}

元々のサイトにあったコメントのようですね。
初心者向けの講座でこういうコメント付けられると混乱して大変ですね

投稿2015/12/30 07:28

編集2015/12/30 07:40
ozwk

総合スコア13512

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

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

Tak1wa

2015/12/30 07:33

なるほど。確かに全体的にコメントがちょっとおかしい気がしますね…
seri

2015/12/30 07:55

余計解らなくなりました。。w もう一度別のサイトで整理してきます・・
guest

0

ベストアンサー

実行結果

Dataオブジェクトの数:0 ← ★★ for ループの前です ★★

値:0 数:1
Dataオブジェクトの数:1
値:100 数:2
Dataオブジェクトの数:2

forループの前にData.ShowNumber()があるので、それで勘違いされていないでしょうか。
コードはそのまま、順次実行されます。優先順位なんてありませんよ。
インスタンスが作成されれば、直ぐにコンストラクタが実行されます。
実行結果もその通りだと思います。

投稿2015/12/30 07:53

akiruno-oneone

総合スコア815

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

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

seri

2015/12/30 08:02

もう一度、考え直すと上手くいきました、、、 ありがとうございます。
guest

0

こんにちは。

コンストラクタの読み込み優先順序は、for文内のブロック式よりも低く、for文1回分のループよりも高い

意味がよくわかりませんでしたが、
ShowNumberは静的メソッドなのでコンストラクタ云々は関係ありません。

投稿2015/12/30 06:40

Tak1wa

総合スコア4791

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

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

seri

2015/12/30 06:52

public Data(int id) {... が読み込まれているのが、for文の後なのが疑問、といった方が解りやすかったかもしれません。 インスタンスが作られた後に public Data(int id) {...が一度だけ読み込まれるとゆうのは解ったのですが、実行結果を見た限りでは、for文の最後の式 Data.ShowNumber(); の後に、public Data(int id)が読み込まれている事が少し疑問です、、 インスタンスが作られる時に読み込まれるのであれば先に public Data(int id) {...を読み込み、ShowNumberを読み込んでもおかしくないと思うのです
Tak1wa

2015/12/30 07:14 編集

コンストラクタの実行は d[i] = new Data(i*100); にて行われます。なのでfor文中です。 Data.ShowNumber()の時点ではコンストラクタが実行された後なのでData.numがインクリメントされているということです。 >for文の後なのが疑問 何を以てfor文の後だと解釈されたのでしょうか。 動的インスタンスと静的インスタンスの違いは理解されているでしょうか。
seri

2015/12/30 08:01

成程、理解しました! 解りやすい回答助かります♪ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問