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

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

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

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

Q&A

解決済

4回答

1306閲覧

クラスの中にあるstring配列を初期化する方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2017/04/17 05:25

下記のプログラムにて、1)は、ss1を経由して、string[]を宣言し初期化をしています。
2)は、経由なしで直接初期値を代入しています。
1)2)共にエラーもなく正常動作していますが、問題は無いのでしょうか?
2)には、static宣言が何処にもありません。

2)の部分に問題は無いのでしようか。
ご存知の方教えていただけないでしょうか?

C#

1public partial class Form1 : Form 2{ 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void Form1_Load(object sender, EventArgs e) 9 { 10 for( int i=0 ; i < mem_com.Length ; ++i) { 11 richTextBox1.Text += mem_com[i].aflag +" " ; 12 richTextBox1.Text += mem_com[i].aint +" " ; 13 richTextBox1.Text += mem_com[i].astr +" " ; 14 richTextBox1.Text += mem_com[i].astr_ar[1] +"\n" ; 15 } 16 } 17 18 public mem_class[] mem_com = new mem_class[] 19 { 20 new mem_class(false,123,"a111",ss0), 21 new mem_class(true, 456,"b222",ss1), // 1) 22 new mem_class(true, 456,"b222",new string[] {"B000","B111","B222","B333"})//2) 23 } ; 24 25 static string[] ss0 = new string[] {"A000","A111","A222"} ; 26 static string[] ss1 = new string[] {"B000","B111","B222","B333"} ; 27 28} 29 30public class mem_class 31{ 32 public bool aflag { get ; set ; } 33 public int aint { get ; set ; } 34 public string astr { get ; set ; } 35 public string[] astr_ar { get ; set ; } 36 37 public mem_class(bool cl_aflag,int cl_aint,string cl_astr,string[] cl_astr_ar) 38 { 39 this.aflag = cl_aflag; 40 this.aint = cl_aint; 41 this.astr = cl_astr; 42 this.astr_ar = cl_astr_ar ; 43 } 44}

動作環境
Windows7、Visual Studio 2015、C#

ご回答宜しくお願いいたします。

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

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

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

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

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

guest

回答4

0

1にはやや問題がある気がします。
問題点はスコープが広く生存期間が長い静的変数ss1を通じてクラス内部の値を変更できてしまうことです。これにより一見するとmem_comと全く関係しないコードがmem_comの内容を書き換えてしまいます。

C#

1private void Form1_Load(object sender, EventArgs e) 2{ 3 ss1[1] = "**UPDATE**"; // 一見するとmem_comとは全く関係なさそうなコードだが、実際は動作に影響する 4 5 for( int i=0 ; i < mem_com.Length ; ++i) { 6 richTextBox1.Text += mem_com[i].aflag +" " ; 7 richTextBox1.Text += mem_com[i].aint +" " ; 8 richTextBox1.Text += mem_com[i].astr +" " ; 9 richTextBox1.Text += mem_com[i].astr_ar[1] +"\n" ; 10 } 11} 12

上の例はわざと書いているので原因が判りますが、想定通り動かないという現象だけからこの原因を探し当てるのが困難であることは想像に難くありません。

投稿2017/04/17 06:54

ku__ra__ge

総合スコア4524

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

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

0

問題ない。当たり前すぎて何が疑問なのかよくわかりません。
変数を共有したい、再利用したいなら、 static なり、フィールドで持つのもいい方法ですが、
その場で作ればいいのなら、そのときにnewすればいいというだけの話です。

投稿2017/04/17 05:33

kiichi54321

総合スコア1984

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

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

0

ベストアンサー

こんにちは。

動作的には他の方がおっしゃっている通り、特に問題ありません。

もしかして、2)でnewしたものをどこにも保持していないかのように見えているのでしょうか? 保持されていないと、GCが走れば回収されるので心配と?(違っていたらごめんなさい。)

2)でnewされたものは、仮引数のcl_astr_arに設定され、この仮引数が生きている限り(このコンストラクタからreturnするまで)解放されることはありませんのでご安心を。

投稿2017/04/17 06:39

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2017/04/17 08:33

有難う御座いました。 開放が心配で・・・ 保持されるのであれば、2)を使用します。
guest

0

問題ないのでは?
というか「ss1を経由して」という方が逆に何の意味があるのかと疑問です。
エラーもなく正常動作が確認できているのに問題があるかも、とは何を懸念されているのでしょうか。

投稿2017/04/17 06:02

workaholist

総合スコア559

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問