2

レガシー コードの湿ったカタコンベとほこりっぽいダンジョンを探索しているときに、これに出くわしました。

FormatString formatString = new FormatString();
if (formatString.containsAlpha(UPCE) != -1) 
{
    UPCLen = 11;
}

私は何かを見逃していますか、それともこれに対する私の反応ですか? 何も割り当てられていません... 「見つからない」ことを示すと仮定すると、常に-1になります」正しいですか?

アップデート

コメントで明らかになった一般的な混乱への回答として、私は FormatString が荒廃した石器時代の .NET のもの (このプロジェクトでは .NET 1.1 を使用) だと思っていましたが、その通りです。これは自家製のクラスです。コンストラクタは次のとおりです。

public FormatString()
{
}

...そして、containsAlpha() メソッド:

public int containsAlpha(string strToCheck)
{
    const string ALPHA_CHARS = "abcdefghijklmnopqrstuvwxyz";
    try
    {
        char[] tmpCharArry = ALPHA_CHARS.ToCharArray();
        return strToCheck.ToLower().IndexOfAny(tmpCharArry);
    }
    catch(Exception ex)
    {
        Duckbill.ExceptionHandler(ex, "FormatString.containsAlpha");
        return 0; // not -1?
    }
}

ここで質問します。"FormatString" は、このクラスの名前の頭が間違っていますか、それとも何ですか? 私はそれが非常に誤解を招くと感じました(明らかに)。

4

4 に答える 4

3

私たちが知っている限りでは、それは次のようなものかもしれません:

public class FormatString
{
    public int containsAlpha(object foo)
    {
        return 0;
    }
}

それはあなたが示した例を満たすでしょう。コンストラクターの定義さえ必要ありません。

右クリックして「定義に移動」して、それが実際に何をするかを確認する必要があります。

アップデート

更新された詳細に基づいて、新しい.NET Frameworkを使用できる場合は、関数全体を次のように置き換えることができると思います:

using System.Linq;

public static bool ContainsAlpha(string s)
{
    return s != null && s.Any(Char.IsLetter);
}

しかし、あなたは立ち往生しているので、これも同様に機能するはずです:

public static bool ContainsAlpha(string s)
{
    if (s == null) return false;

    for (int i = 0; i < s.Length; i++)
        if (Char.IsLetter(s, i))
            return true;

    return false;
}

または、次のようにします。

public static bool ContainsAlpha(string s)
{
    if (s == null) return false;

    for (int i = 0; i < s.Length; i++)
        if (Char.IsLetter(s[i]))
            return true;

    return false;
}
于 2013-09-13T23:31:20.000 に答える
2

「FormatString」はこのクラスの名前の頭が間違っていますか、それとも何ですか?

私の意見では、はい。のように、またはそのような
名前にする必要があります。 また、そうあるべきです。 StringUtilsStringHelper
static

更新
さらに、拡張メソッドであることをお勧めします。次に、次のようになります。

string UPCE = // whatever
if(UPCE.ContainsAlpha())
{
 // ...
}
于 2013-09-13T23:35:52.270 に答える
1

明らかに奇妙で ("contains..." はブール値を返すべきではありませんか?) 直観に反します ("empty" を作成しました。FormatStringつまり、コンストラクターを介して何も渡されませんでした。まったく無意味だと思わないでください。

「containsAlpha」は次のような意味もあります: パラメータ 1 (UPCEこの場合) にアルファベット (おそらく英数字) 文字が含まれているかどうかを確認します。したがってFormatString、文字列がどのようにフォーマットされているかの基本的な特性、つまり数字、文字、特殊文字などが含まれているかどうかをチェックするジェネリック クラスがあります。

また、 UPCなどFormatStringの形式をチェックする特殊なクラス (名前空間を確認しますか?) である可能性もあります。UPCFormatUPCFormatVerifier

私が完全に間違っていなければ、これを .NET フレームワーク関数として認識していません。これはどのターゲット フレームワーク バージョンですか? のソースはありFormatStringますか?それは何と言っていますか?

とにかく、奇妙なコードの美しい作品。;-)

Ziffusion の答えも理にかなっています。コンストラクター コードを見てください。おそらくそれは、デフォルト状態に関する初期化、またはさらに悪いことに、システム全体を実行しない限り見つけることができない静的なグローバル状態に関するものです。

編集:あなたの編集を読んでください-結局のところ、FormatString「一般的な文字列形式のチェック」を行うのは正しかったです。おそらくStringFormatもう少し良い名前になるでしょうが、全体として、UPCのフォーマットを確認したい場合は、フォーマットを含む文字列からUPCオブジェクトを構築する静的ファクトリ/ビルダーメソッドを持つUPCクラスを用意してください。チェックするか、UPCFormatCheck特定のフォーマットをチェックする仕事だけを行うクラスを作成します。このようにして、何かを意味する可能性のあるあまりにも一般的な名前をすべて回避します。(そのクラスでは、提案されているように、クールな LINQ-oneliner を使用して実際のチェックを行うことができます。)

于 2013-09-13T23:32:03.420 に答える