我应该扩展系统类型,还是只创建静态实用程序类?我怎么知道什么时候做?

时间:2014-03-17 19:20:30

标签: c# .net

所以我的问题更多的是关于我应该做什么,而不一定是'如何'实现我正在做的事情。所以,我有这个看起来像这样的静态类:

public static class CanImportFileType
{
   static Predicate<string> isSTQFile = f => f.ToLower().EndsWith(".stq") || f.ToLower().EndsWith(".stqt");
   static Predicate<string> isAPHFile = f => f.ToLower().EndsWith(".aph");


    public static bool IsValidQuoteFilePath(string[] FilePath)
    {
        bool IsValidQuoteFilePath = false;
        if(HasFile(FilePath))
        {
            if(isSTQFile(FilePath[0]))//we just look at the first index...we could extend this to look through all of the indices and find the first appropriate 
            {
                IsValidQuoteFilePath = true;
            }
        }
        return IsValidQuoteFilePath;
    }
    public static bool IsValidQuoteFilePath(string FilePath)
    {
        bool IsValidQuoteFilePath = false;
            if (isSTQFile(FilePath))
            {
                IsValidQuoteFilePath = true;
            }
        return IsValidQuoteFilePath;
    }


    public static bool IsValidAPHFilePath(string[] FilePath)
    {
        bool IsValidQuoteFilePath = false;
        if (HasFile(FilePath))
        {
            if(isAPHFile(FilePath[0]))
            {
                IsValidQuoteFilePath = true;
            }
        }
        return IsValidQuoteFilePath;

    }
    public static bool IsValidAPHFilePath(string FilePath)
    {
        bool IsValidQuoteFilePath = false;

        if (isAPHFile(FilePath))
        {
            IsValidQuoteFilePath = true;
        }

        return IsValidQuoteFilePath;
    }

    /// <summary>
    /// used only to determine if the string array being passed around is not null or void of any strings (count == 0)
    /// </summary>
    /// <param name="fileLocation"></param>
    /// <returns> whether or not there is a file type in the first index of a string array</returns>
    private static bool HasFile(string[] fileLocation)
    {
        bool hasfile = false;
        if (fileLocation != null)
        {
            if (fileLocation.Count() > 0)
            {
                hasfile = true;
            }
        }
        return hasfile;
    }
}

现在实现这个我会有这样的事情:

string[] foo = {"hello", "world"};
CanImportFileType.IsValidQuoteFilePath(foo) //returns false

或者,我可以通过在方法参数的开头添加一个'this'关键字来扩展string []和字符串类型,如下所示:

      public static bool IsValidQuoteFilePath(this string[] FilePath)
    {
        bool IsValidQuoteFilePath = false;
        if(HasFile(FilePath))
        {
            if(isSTQFile(FilePath[0]))//we just look at the first index...we could extend this to look through all of the indices and find the first appropriate 
            {
                IsValidQuoteFilePath = true;
            }
        }
        return IsValidQuoteFilePath;
    }

然后,我要做的就是实现它就像访问那样的字符串IsValidQuoteFilePath方法:

    string[] foo = {"hello", "world"};
    foo.IsValidQuoteFilePath() //returns false

我想总结一下我的问题:你怎么知道何时只是扩展一个方法而不是创建一个静态助手类?

2 个答案:

答案 0 :(得分:2)

  

您如何知道何时只是扩展方法而不是创建静态助手类?

两者基本相同 - 更多的是你期望和想要使用这些物品。

我的一般经验法则是:这种方法是否会成为每个开发人员(可能)想要在每个 stringstring[]实例上使用的方法?如果是这样,请考虑扩展方法。如果没有,请使用常规静态方法。

在这种情况下,似乎用例非常狭窄,并且不适合任意string实例,这将建议一个普通的静态辅助方法。核心内置类型(对象/字符串/等)几乎​​总是如此,因为一种方法非常适合该类型的所有用途。

另外:请注意,这不是扩展类型,它只是提供了一种不同的语法来访问静态方法。

答案 1 :(得分:0)

在第二种情况下,您不是扩展类型。您的代码无法修改string[]类型。您只是提供语法糖,使其出现,就像您的方法是实例方法一样。它不是;它仍然是一种静态方法。

两者之间没有真正的功能差异;后者的编译看起来就像前者一样。这完全取决于您使用的个人偏好。