0

私が書いた以下のコードで.NETの初心者です。最初にキーワードを大文字に変換する必要があります。その後、それ以外の場合ははしごです。正確さを確認してください。ここに私のコードがあります。

 private string toupper(string keyword)
    {
        newkeyword = keyword.ToUpper();

        return newkeyword;
    }

    private string check(String newkeyword)
    {
        if (newkeyword == SETTELG || SETTHJORT)
        {
            Response.Redirect("../SMSFunction/SeenSMS.ascx");
        }
        else if (newkeyword==SKUTTELG || SKUTTHJORT)
        {
            Response.Redirect("../SMSFunction/ShotSMS.ascx");
        }

        else if (newkeyword == RUNDBALL)
        {
            Response.Redirect("../SMSFunction/RoundballSMS.ascx");
        }
    }
4

3 に答える 3

2

StringDictionary大文字と小文字が区別されないため、大文字/小文字を避けることができます-フィールドとして:

readonly StringDictionary redirects = new StringDictionary {
    {SETTELG,    "../SMSFunction/SeenSMS.ascx"},
    {SETTHJORT,  "../SMSFunction/SeenSMS.ascx"},
    {SKUTTELG,   "../SMSFunction/ShotSMS.ascx"},
    {SKUTTHJORT, "../SMSFunction/ShotSMS.ascx"},
    {RUNDBALL,   "../SMSFunction/RoundballSMS.ascx"},
};

それからちょうど:

var path = redirects[keyword];
if(path != null) Response.Redirect(path);
于 2012-06-07T07:12:07.457 に答える
1
private void Check(string keyword)
    {
        switch(keyword.ToUpper())
        {
            case "SETTELG ":
            case  "SETTHJORT":
                Response.Redirect("../SMSFunction/SeenSMS.ascx");
                break;
                /*remaining code*/
        }
    }

次のようにしてください...

于 2012-06-07T07:04:53.083 に答える
1

キーワードやその他の (ドメインの) よく知られた文字列値に関しては、何らかの解析を使用することを好みます。あなたの特定のケースでは、おそらく列挙型を定義します

public enum Keywords {
    SettleLG,
    SettHjort,
    SkutteLG,
    SkuttHjort,
    RundBall    
}

次に、キーワードを解析できます

//Note this will (deliberately) throw an exception 
//if the string does not match a defined value
//depending on your needs you might want to handle that
var parsedKeyword = (Keywords)Enum.Parse(typeof(Keywords),keyword,true);

それが整ったら、スイッチを書くことができます

private string GetRelativUrlFromKeyword(Keywords parsedKeyword){
    switch(parsedKeyword)
      case Keywords.SetteLG:
      case Keywords.SettHjort:
        return "../SMSFunction/SeenSMS.ascx";
      case Keywords.SkutteLG:
      case Keywords.SkuttHjort:
        return "../SMSFunction/ShotSMS.ascx";
      case KeyWords.RundBall:
        return "../SMSFunction/RoundballSMS.ascx";
      default:
        throw new InvalidOperationException("Keyword not recognized" + parsedKeyword);
}

すべてをまとめると、呼び出しコードは次のようになります

var parsedKeyword = (Keywords)Enum.Parse(typeof(Keywords),keyword);
var relativeUrl = GetRelativUrlFromKeyword(parsedKeyword);
Response.Redirect(relativeUrl,true);

値を列挙型として解析することにより、値 (1) も検証します。これにより、誤った値を渡すコードの他の部分に関連するバグを簡単に見つけることができます。キーワードと相対 URL の間の場合のように、ある値のセットと別の値のセットの間にハードコーディングされたマップが必要な場合は、スイッチ コンストラクトが正常に機能します。

各関数/メソッドが 1 つのことを実行するタイミングをコードで判断しやすくするため、マッピングを別の関数に分割しました。スイッチのデフォルトのケースでは、例外がスローされます。これは、新しいキーワードを追加したときにそれをスイッチで処理するのを忘れたときにキャッチするためです。他のデフォルトを選択できます。私は通常、コードの他の部分を変更するときに何かをするのを忘れたために、デフォルトのケースで例外をスローするのが好きです。(2)。また、response.redirect に bool (true) を追加しました。これは、フレームワークに、応答が完了したこと、およびそれをクライアントに送信できることを伝えます (これはマイナーですが、コードを次のように明示的にすることを好みます)。コードの意図に関しては可能です。)

(1) キーワード文字列を取得できない場合はお知らせください。代わりに TryParse を使用する方法を示すことができます。 F# では不完全なパターン マッチングがありますが、スイッチでは必ずしも可能ではありません (たとえば、文字列を使用する場合はそうではありません)。

于 2012-06-07T07:25:28.957 に答える