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

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

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

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

Q&A

解決済

4回答

6318閲覧

クラス内のフィールドでの初期化

mnhktm

総合スコア25

C#

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

1グッド

0クリップ

投稿2019/06/29 01:31

C#でプログラムを書いている時、ある時ふと疑問に思いました。
例えばクラス内のフィールドに別クラスの変数を定義したときの、初期化の方法です。

class Test  // 例
{
classA a;    // やり方 A
classB b = new classB(); // やり方 B 見栄えが良くないような・・
public Test
{
a= new classA();       // やり方 A
}

上記の書き方で 別クラス classA 型の a と classB 型の b を記述する場合
どちらの記述の仕方が良いのでしょうか?どちらも動きます。

・どちらでも好きなほう
・やり方A または やり方B
・そもそもフィールドには別クラスの変数は書かないほうが良い

ググってみても見つけられず、基本が判ってないのですが・・
いかがでしょうか?

DJR-tech👍を押しています

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

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

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

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

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

guest

回答4

0

私個人としては、やり方Aを使うようにしています。
理由としては、初期化のタイミング、順序が明確になるからです。

ただ、サンプルなどさっと作成する場合はBで書くことが多い気がします。

>そもそもフィールドには別クラスの変数は書かないほうが良い
これはスコープの話もありますので今回の話とは別だと思います。

投稿2019/06/29 01:42

YAmaGNZ

総合スコア10222

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

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

mnhktm

2019/06/29 02:07

わかりやすいご回答ありがとうございます。 Bは定義?宣言?とのところに動作を書いているような気が 個人的にはするので私もAで記述しています。
guest

0

初期化の順序はどのような順番でも問題ないことが多いので、基本は「フィールド宣言と同時に初期化」してしまっていいと思います。

あくまで初期化の順番が重要になってしまう場合にのみ、コンストラクタ内での順序付けされた初期化を用いるようにしています。

(なるたけ初期化順番に依存しない設計が望ましい)(各クラスの独立性が十分に保たれていると保守運用が容易になります)

おまけにですが、もしフィールド宣言やコンストラクタで初期化された後で再代入することがないようであれば

private readonly ClassA _classA;

と宣言することで「コンストラクタを通った後、状態が変わらないよ」と宣言することができます。(readonlyはフィールドでの初期化、またはコンストラクタ内でのみ代入ができます)

投稿2019/06/29 02:11

tor4kichi

総合スコア763

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

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

mnhktm

2019/06/29 02:22

ご回答ありがとうございます。 私の頭が固いので、フィールドでの初期化は可能ではあるが、 コンストラクタで行うほうが行儀が良いと勝手に思っていました。 readonly も参考になります。
guest

0

Aがダメってわけではないですが、好みで言えば圧倒的にBです。
コードの局在性の面では定義と同時に初期化したほうが解りやすいからです。
だだしフィールドの初期化ではほかのフィールドを参照できないので
汎用性や統一感ではAに軍配が上がります。

投稿2019/06/29 02:10

hihijiji

総合スコア4150

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

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

mnhktm

2019/06/29 02:16

ありがとうございます。 なるほど、定義と同時に初期化 ですね。 参考になります。
guest

0

ベストアンサー

好きな方でどーぞ

・そもそもフィールドには別クラスの変数は書かないほうが良い

なんでこんな発想になるのかそっちのほうが不思議ですが。

投稿2019/06/29 01:40

y_waiwai

総合スコア87719

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

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

mnhktm

2019/06/29 02:03

ご回答ありがとうございます。 ・・ですよね・・ 動けば何でもいいというスタンスでプログラムしていましたので ふと振り返ったとき、疑問に思いました。 明確にどちらも可と書いてある参考を見つけられなかったので 安心しました。
y_waiwai

2019/06/29 02:12

動いてるならそれは正義、ですが、まあ物事にはいろいろルールがあってこうじゃないといけないってこともあるので、初心者の頃は不安なのだと思います。 そこらへんの理屈は、コードを組んでいくうちにおいおいわかってくるものと思いますです #明確に遅くなるとかバグが出やすいとか見づらいとかの理由がなければ、まーいいんじゃないかと
mnhktm

2019/06/29 02:32

y_waiwai さん ありがとうございます。 私のあるプログラムは小さな種類別のクラスをたくさん作り、その インスタンスをListにして、順番に見ていく時の判断にするため、 別クラスのフィールド変数をたくさん使った判断クラスを書いています ています。プログラムもそこそこ出来上がったのですが、よくない書き方 というのが後からわかったら「えらいこっちゃ」となるので不安に 思ったわけです。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問