0

これは私のコードです:

public String[] readXML(String filename)  
{  
    XmlReader xmlReader = XmlReader.Create(@filename);  
    List<String> names = new List<string>();
    String[] keywords = null;
    while (xmlReader.Read())  
    {  
        //Keep reading  
        if (xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))  
        {  
            // get attribute from the Xml element here  
            string keywords = xmlReader.GetAttribute("name");  
            names.Add(keywords);  
            String[] keywordsArray = names.ToArray();  
        }  
        else
        {
            MessageBox.show("An Error Occured");
        }
    }  
    return keywordsArray;
}

これでいいでしょうか?誰かがこれをテストできますか?

4

4 に答える 4

12

return ステートメントがループ内の if 内にあるためだと思います。ループが実行されない場合、または if never が true の場合はどうなりますか?

于 2009-11-08T16:55:43.360 に答える
6

自分のコードを理解していますか?このメソッドから何を返したいですか? 現在、コードは次のことを意味します。
「キーワード」要素が見つからなくなるまで XML ファイルを読み取ります。「キーワード」要素が見つかった後、その「名前」属性の値を取得し、1 つの要素配列にラップして返します。
他の人が述べたように、XML ドキュメントに要素がない場合があります。その場合、値を返さずにループを終了します。その場合にどうするかを決める必要があります。「null」や空の配列などの特別な値を返すことができます。または、指定された XML ドキュメントに少なくとも 1 つの "Keyword" 要素が存在する必要があることが確実な場合は、メソッドの最後から何らかの例外をスローして、いくつかの前提条件に違反したことを示すことができます。
異なる動作でメソッドを記述しようとしたと思います。次のことを意味していると思います:
XMLファイルを読み取り、すべての「キーワード」要素から「名前」属性の値を収集し、収集した値を文字列配列として返します。
それはより意味があり、その場合、XML ファイルに「キーワード」要素が含まれていない場合でも、常に何らかの結果が得られます。このような動作を実現するには、 list を array 変換に移動し、 return ステートメントを method の最後に移動する必要があります。次のようなコードがあります。

public static String[] readXML(String filename)
{
    using(XmlReader xmlReader = XmlReader.Create(@filename))
    {
        List<String> names = new List<string>();
        while(xmlReader.Read())
        {
            //Keep reading  
            if(xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))
            {
                // get attribute from the Xml element here  
                string keywords = xmlReader.GetAttribute("name");
                names.Add(keywords);
            }
        }
        String[] keywordsArray = names.ToArray();
        return keywordsArray;
    }
}

メソッドを終了する前に確実に破棄されるように、作成された XmlReader の使用も "using" ブロックでラップしたことに注意してください。

于 2009-11-08T17:33:14.160 に答える
3

ループの外にreturnステートメントを配置する必要があります。そうしないと、名前が「キーワード」にならない場合、コードは返されません。

于 2009-11-08T16:57:25.073 に答える
3

メソッドの最後に while および if のデフォルトの戻り値が必要です。

コンパイラが言うように、すべてのコード パスに対して return ステートメントが必要です。while が実行されない場合は、戻りません。if ステートメントについても同様です。

于 2009-11-08T16:56:21.550 に答える