繁体   English   中英

C#构造函数重载(使用此关键字)

[英]C# Constructor Overloading (using this keyword)

我正在尝试学习C#,但遇到了一些问题。 对于大多数有经验的程序员来说可能是显而易见的,但对我而言不是:(

我正在尝试编写一个应该具有3个构造函数重载的类:

  • 我只指定文件夹。
  • 我指定文件夹和文件类型(文件扩展名)。
  • 我为子文件夹搜索指定文件夹,文件类型和是/否。

根据用户规范,该类返回一个列表。

所以我写了下面的代码:

public class SearchForFiles
{
    private readonly List<string> _filePath = new List<string>();
    private readonly List<string> _fileType = new List<string>();
    private readonly bool _searchSubFolder = false;
    private SearchOption _searchOption = SearchOption.TopDirectoryOnly;
    private readonly IEnumerable<string> _searchForFiles = null;

   /// <summary>
    /// Searching all the files in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    public SearchForFiles(string searchFolder)
    {
        _filePath.Add(searchFolder);
        _fileType.Add(".*");
        FindFiles(_filePath, _fileType, false);
    }

    /// <summary>
    /// Searching all the files with the specified file extension in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    /// <param name="fileType">Specify extension of the file search</param>
    public SearchForFiles(string searchFolder, string fileType)
        : this(searchFolder)
    {
        _fileType.Add(fileType);
        FindFiles(_filePath, _fileType, false);
    }

    public SearchForFiles(List<string> searchFolder, List<string> fileType, bool searchSubFolder)
        : this(searchFolder, fileType)
    {
        _searchSubFolder = searchSubFolder;
        FindFiles(_filePath, _fileType, _searchSubFolder);
    }

问题是第三个重载,我不明白为什么第二个重载可以,但第三个重载没问题。

如果有人可以给我一些帮助,那将是很大的。

这是有效的更新代码:

/// <summary>
/// Returning a list of files depending on the user choices.
/// </summary>
public class SearchForFiles
{
    private readonly List<string> _filePath = new List<string>();
    private readonly List<string> _fileType = new List<string>();
    private readonly bool _searchSubFolder = false;
    private SearchOption _searchOption = SearchOption.TopDirectoryOnly;
    private IEnumerable<string> _searchForFiles = null;

    /// <summary>
    /// Searching all the files with the specified file extension(s) in the specified folder(s) and sub folder(s) if wanted.
    /// </summary>
    /// <param name="searchFolder">Specify folder(s) for file(s) search</param>
    /// <param name="fileType">Specify file extension(s) for the search</param>
    /// <param name="searchSubFolder">Specify if you want to search in sub folder(s)</param>
    public SearchForFiles(List<string> searchFolder, List<string> fileType, bool searchSubFolder)
    {
        _filePath = searchFolder;
        _fileType = fileType;
        _searchSubFolder = searchSubFolder;
        FindFiles();
    }

    /// <summary>
    /// Searching all the files with the specified file extension in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    /// <param name="fileType">Specify file extension for the search</param>
    public SearchForFiles(string searchFolder, string fileType)
        : this(new List<string>() {searchFolder}, new List<string>() {fileType}, false)
    {

    }

    /// <summary>
    /// Searching all the files in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    public SearchForFiles(string searchFolder)
        : this(new List<string>() {searchFolder}, new List<string>(), false)
    {

    }

    private List<string> FindFiles()
    {
        var findFiles = new List<string>();

        if (_searchSubFolder == true)
            _searchOption = SearchOption.AllDirectories;

        foreach (var filePath in _filePath)
        {
            if (_fileType.Count == 0)
            {
                _searchForFiles = Directory.EnumerateFiles(filePath, "*.*", _searchOption);
            }
            else
            {
                _searchForFiles = Directory.EnumerateFiles(filePath, "*.*", _searchOption).Where(e => _fileType.Contains(new FileInfo(e).Extension, StringComparer.OrdinalIgnoreCase));
            }

            foreach (var file in _searchForFiles)
            {
                findFiles.Add(file);
            }
        }

        return findFiles;
    }
}

非常感谢所有的提示和答案:)

@CrazyNoun,正如@ D-Shih所说,您必须首先纠正类型不匹配的问题。 关于构造函数:构造函数重载可以实现为以多种方式达到单个目标(例如,Windows窗体中的MessageBox.Show()重载),并且可以实现为通过多种方式达到多个目标(例如,Convert.ToString()重载) 。

您想达成一个目标。 这样,我们应该定义Defaults 您的声明是相反的顺序。 实际上,您必须定义以下内容:

public class SearchForFiles
{
     public SearchForFile(List<string> searchFolder, List<string> fileType, bool searchSubFolder)
     {
         _searchSubFolder = searchSubFolder;
         FindFiles(searchFolder, fileType, searchSubFolder);
     }

     public SearchForFiles(string searchFolder, string fileType):this(new List<string>(){searchFolder}, new List<string>(){fileType}, false)
     {

     }

     public SearchForFiles(string searchFolder):this(new List<string>(){searchFolder}, new List<string>(), false)
     {

     }

我已经向构造函数添加了List支持。 因此,如果您想将其概括化。 如您所见,无需为每个“构造函数签名”编写一个正文。 实际上,其他构造函数将为主构造函数输入一些输入参数,并且它们将通过放置值并添加一些默认值以使其更快使用来调用它来运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM