変数スコープ確認
例えばこんなコード。
using System; using System.Collections.Genelic; public testClass { public static List<List<string>> searchRequest(string word) { List<List<string>> result = new List<List<string>>(); List<string> rowItem = new List<string>(); //feedには、SyndicationFeed feed = SyndicationFeed.Load(...)で生成されたオブジェクトが入っている。 foreach (SyndicationItem item in feed.Items) { rowItem.Clear(); //これが問題 DateTimeOffset publishLocalTime = item.PublishDate.ToLocalTime(); rowItem.Add(item.Id); rowItem.Add(item.Authors[0].Name); rowItem.Add(item.Title.Text); rowItem.Add(publishLocalTime.ToString("yyyy/MM/dd (ddd) HH:mm:ss")); result.Add(rowItem); } } return result; } }
このメソッドを、呼び出したとき、"result"Listコレクションに入る値が、
全て同一のものとなってしまった。
どうやらClear()メソッドがうまく動作していないらしい。
次に、foreach内のClear()メソッド呼び出し位置を、下記のようにしてみた。
foreach (SyndicationItem item in feed.Items) { DateTimeOffset publishLocalTime = item.PublishDate.ToLocalTime(); rowItem.Add(item.Id); rowItem.Add(item.Authors[0].Name); rowItem.Add(item.Title.Text); rowItem.Add(publishLocalTime.ToString("yyyy/MM/dd (ddd) HH:mm:ss")); result.Add(rowItem); rowItem.Clear(); //これも問題 }
このようにすると、今度は配列サイズは正常個数確保されているものの、
中身は”空”、string型なので""(空文字列)が代入されていた。
これはなんとなくわかる。"result"が返される前に、Clear()してしまうと、
参照すべき内容が空になってしまっているからであろう。
結局、ちょっとリソースの無駄遣いだが、こうした。
foreach (SyndicationItem item in feed.Items) { List<string> rowItem = new List<string>(); //ループごとListインスタンス生成。 DateTimeOffset publishLocalTime = item.PublishDate.ToLocalTime(); rowItem.Add(item.Id); rowItem.Add(item.Authors[0].Name); rowItem.Add(item.Title.Text); rowItem.Add(publishLocalTime.ToString("yyyy/MM/dd (ddd) HH:mm:ss")); result.Add(rowItem); //rowItem.Clear(); 使用をやめた。 }
最適化すればもう少しよくなるはず。
だが、とりあえずメモしておこう。