2

在探索我们遗留代码的潮湿地下墓穴和尘土飞扬的地牢时,我遇到了这个问题:

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

我错过了什么,还是我对此的反应,即:formatString 怎么能包含任何东西?什么都没有分配给它......它总是-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 框架,我会说您可以将整个函数替换为:

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”是这个类的错误名称,还是什么?

在我看来,是的。
它应该被命名为StringUtilsorStringHelper或类似的东西。
而且应该是static

更新
更重要的是,我更希望它是一种扩展方法。然后它会像:

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

FormatString 可能是从某种形式的配置初始化的。我会检查构造函数。这是唯一有意义的方法(对我来说)。

于 2013-09-13T23:30:17.953 回答
1

尽管它显然很奇怪(“不应该“包含...”返回布尔值吗?)并且违反直觉(我创建了一个“空” FormatString,即没有任何东西通过它的构造函数,为什么它应该做任何事情?),它没有不要让我觉得完全荒谬。

“containsAlpha”也可能意味着:检查参数 1(UPCE在这种情况下)是否包含字母(可能是字母数字)字符。FormatString一些通用类也会检查字符串格式的基本特征,即它们是否包含数字、字母、特殊字符等。

也有可能FormatString是一些专门的类(检查命名空间?)检查例如UPCs的格式,并且可能更好地被称为UPCFormatUPCFormatVerifier

如果我没有完全弄错的话,我不认为这是一个 .NET 框架函数。这是哪个目标框架版本?你有源FormatString吗?它说什么?

无论如何,一段漂亮的奇怪代码。;-)

Ziffusion 的回答也有道理,看看构造函数代码。也许它做的比它应该做的更多,一些关于一些默认状态的初始化,或者更糟糕的是,一些涉及静态全局状态的东西,除非你运行整个系统,否则你永远不会发现。

编辑:现在阅读您的编辑 - 事实证明,我是对的,FormatString“通用字符串格式检查”。可能StringFormat是一个稍微好一点的名字,但总而言之,我想说:如果您想检查 UPC 的格式,请使用带有静态工厂/构建器方法的 UPC 类,该方法从字符串构建 UPC 对象,包括格式检查,或创建一个UPCFormatCheck仅执行检查特定格式的类。这样,您就可以避免所有可能意味着任何东西的过于笼统的名称。(在该课程中,您显然可以按照建议使用一些很酷的 LINQ-oneliner 进行实际检查。)

于 2013-09-13T23:32:03.420 回答