自由気ままなITメモログ

パソコン、サーバー、モバイル関連等の情報・Tipsを、不定期で綴るメモ集です。

変数スコープ確認

例えばこんなコード。

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(); 使用をやめた。
                }

最適化すればもう少しよくなるはず。
だが、とりあえずメモしておこう。