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

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

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

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

Q&A

解決済

3回答

6241閲覧

c# Listの参照わたしでビルドエラー

KKcambodia

総合スコア14

C#

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

0グッド

1クリップ

投稿2016/06/21 12:27

編集2016/06/21 12:57

ご指摘の通り、変数名を変えてみました。

overrideは、ややこしいので、削除しました。
しかし、
コントロールが現在のメソッドを抜ける前に割り当てられる必要があります。
といったビルドエラーになります。
エラーのメッセージが言わんとしていることは理解できますが、
変数定義をどう変えればよいのか、わかりません。

using System; using System.Collections.Generic; using System.Windows.Forms; namespace StudyProject { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("処理を開始します"); // out を使った場合、変数を初期化不要 List<string[]> Data = new List<string[]>(); CsvEdit1 obj1 = new CsvEdit1(); obj1.ReadCsv(out Data); MessageBox.Show("ここでブレークポイントでチェック"); } } public class CsvEdit1 { public void ReadCsv(out List<string[]> Data) { List<string[]> tempData = new List<string[]>(); try { // csvファイルを開く System.IO.DirectoryInfo dirPath = new System.IO.DirectoryInfo(@"E:/A/"); System.IO.FileInfo[] files = dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories); // 指定フォルダからCSVを取得し、配列に格納する。 foreach (System.IO.FileInfo filePath in files) { using (var readCsv = new System.IO.StreamReader(filePath.FullName)) { //ヘッダを読み捨てる。 readCsv.ReadLine(); // ストリームの末尾まで繰り返す while (!readCsv.EndOfStream) { // ファイルから一行読み込む string line = readCsv.ReadLine(); // カンマ区切りで分割して配列に格納する string[] record = line.Split(','); tempData.Add(record); } } } MessageBox.Show("読み込み完了しました。"); } catch (System.Exception e) { // ファイルを開くのに失敗したとき MessageBox.Show(e.ToString()); } } } }

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

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

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

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

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

guest

回答3

0

out いらないんじゃないですか?

これは戻り値みたいなもので、呼び出す関数でなく、呼ばれた関数で初期化して返すものです。

投稿2016/06/21 13:05

Zuishin

総合スコア28660

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

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

KKcambodia

2016/06/21 13:12

Zuishinさま いつもありがとうございます。 outをとってもうまくいきません。 もうすこし試してみます。
guest

0

ベストアンサー

out修飾子で引き渡された変数は、メソッドを抜ける前になんらかの割り当てが行われる必要があります。
詳しくは以下を参照ください。

https://msdn.microsoft.com/ja-jp/library/t3c3bfhx.aspx

投稿2016/06/21 13:04

y-sakamoto

総合スコア194

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

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

KKcambodia

2016/06/21 13:15

y-sakamotoさま ありがとうございます。 msdnをみてみました。 static void Method(out int i) { i = 44; } と同じように、 かえてみたのですが、どうもうまくいきません。 out 命令は、配列渡しができないのでしょうか? public class CsvEdit1 { public void ReadCsv(out List<string[]> tempData) { try { // csvファイルを開く System.IO.DirectoryInfo dirPath = new System.IO.DirectoryInfo(@"E:/StudyDrive/Desktop/Study/StudyProject/INDATA/"); System.IO.FileInfo[] files = dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories); // 指定フォルダからCSVを取得し、配列に格納する。 foreach (System.IO.FileInfo filePath in files) { using (var readCsv = new System.IO.StreamReader(filePath.FullName)) { //ヘッダを読み捨てる。 readCsv.ReadLine(); // ストリームの末尾まで繰り返す while (!readCsv.EndOfStream) { // ファイルから一行読み込む string line = readCsv.ReadLine(); // カンマ区切りで分割して配列に格納する string[] record = line.Split(','); tempData.Add(record); } } } MessageBox.Show("読み込み完了しました。"); } catch (System.Exception e) { // ファイルを開くのに失敗したとき MessageBox.Show(e.ToString()); } } }
y-sakamoto

2016/06/21 14:26

tempDataに値が割りあたっておりません。 簡素なソースですが、以下のように変更して下さい。 また予断ではありますが、Listはクラスであるため参照渡しされます。 その為、質問者様の例ですとそもそもout修飾子がなくとも、Addした値を呼び出し側のメソッドで参照可能です。 '''C# public void RunOutMethod() { List<string[]> data; OutMethod(out data); } public void OutMethod(out List<string[]> result) { result = new List<string[]>(); result.Add(new[] { "test" }); } '''
y-sakamoto

2016/06/21 14:37

上でお話しました、参照渡しについて簡単に検証するソースを書きましたので記載しておきます。 意味を理解した上で用件にマッチするほうをお使いいただければと思います。 public void RunReferenceMethod() { List<string[]> data = new List<string[]>(); ReferenceMethod(data); MessageBox.Show(data[0][0]); //メッセージボックスに「test」と表示されます } public void ReferenceMethod(List<string[]> result) { result.Add(new[] { "test" }); }
KKcambodia

2016/06/22 11:55

y-sakamotoさま ありがとうございます。 理解できました。 tempData = new List<string[]>(); をtryの上で定義することにより、 class内で、tempDataが有効になり、 うまくoutで引き渡しできました。 変数tempDataの定義場所を理解していなかったようです。 大変勉強になりました。 ありがとうございます。
guest

0

引数名と新しく定義している変数の名称が重複しております。
具体的には以下の部分となります

C#

1using System; 2using System.Collections.Generic; 3using System.Windows.Forms; 4 5namespace StudyProject 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 private void button1_Click(object sender, EventArgs e) 15 { 16 MessageBox.Show("処理を開始します"); 17 // out を使った場合、変数を初期化不要 18 List<string[]> stArrayData = new List<string[]>(); 19 CsvEdit1 obj1 = new CsvEdit1(); 20 obj1.ReadCsv(out stArrayData); 21 MessageBox.Show("ここでブレークポイントでチェック"); 22 } 23 } 24 25 public class CsvEdit1 : CsvEdit 26 { 27 public override ReadCsv(out List<string[]> stArrayData) ......ここと 28 { 29 List<string[]> stArrayData = new List<string[]>(); ......ここです 30 try 31 { 32 // csvファイルを開く 33 System.IO.DirectoryInfo dirPath = 34 new System.IO.DirectoryInfo(@"E:/StudyProject/input/"); 35 System.IO.FileInfo[] files = 36 dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories); 37 // 指定フォルダからCSVを取得し、配列に格納する。 38 foreach (System.IO.FileInfo filePath in files) 39 { 40 using (var readCsv = new System.IO.StreamReader(filePath.FullName)) 41 { 42 //ヘッダを読み捨てる。 43 readCsv.ReadLine(); 44 // ストリームの末尾まで繰り返す 45 while (!readCsv.EndOfStream) 46 { 47 // ファイルから一行読み込む 48 string line = readCsv.ReadLine(); 49 // カンマ区切りで分割して配列に格納する 50 string[] record = line.Split(','); 51 52 stArrayData.Add(record); 53 } 54 } 55 } 56 MessageBox.Show("読み込み完了しました。"); 57 } 58 catch (System.Exception e) 59 { 60 // ファイルを開くのに失敗したとき 61 MessageBox.Show(e.ToString()); 62 } 63 } 64 } 65 66 public class CsvEdit 67 { 68 public virtual void ReadCsv() 69 { 70 List<string[]> stArrayData = new List<string[]>(); 71 try 72 { 73 // csvファイルを開く 74 System.IO.DirectoryInfo dirPath = 75 new System.IO.DirectoryInfo(@"/"); 76 System.IO.FileInfo[] files = 77 dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories); 78 // 指定フォルダからCSVを取得し、配列に格納する。 79 foreach (System.IO.FileInfo filePath in files) 80 { 81 using (var readCsv = new System.IO.StreamReader(filePath.FullName)) 82 { 83 //ヘッダを読み捨てる。 84 readCsv.ReadLine(); 85 // ストリームの末尾まで繰り返す 86 while (!readCsv.EndOfStream) 87 { 88 // ファイルから一行読み込む 89 string line = readCsv.ReadLine(); 90 // カンマ区切りで分割して配列に格納する 91 string[] record = line.Split(','); 92 93 stArrayData.Add(record); 94 } 95 } 96 } 97 MessageBox.Show("読み込み完了しました。"); 98 } 99 catch (System.Exception e) 100 { 101 // ファイルを開くのに失敗したとき 102 MessageBox.Show(e.ToString()); 103 } 104 } 105 } 106}

投稿2016/06/21 12:42

y-sakamoto

総合スコア194

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問