【问题标题】:C# Constructor Overloading (using this keyword)C# 构造函数重载(使用 this 关键字)
【发布时间】:2018-09-29 21:01:14
【问题描述】:

我正在尝试学习 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;
    }
}

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

【问题讨论】:

  • 因为你的第三个重载构造函数参数是List&lt;string&gt;,但是第二个重载构造函数需要传递string。类型不同。
  • 解决方案相当简单。你给重载一个列表,你需要给它一个字符串。
  • 我们暂时忽略第三个。你的前两个应该颠倒过来;一个参数的构造函数应该调用两个参数的构造函数,而不是相反。实际上,如果有人调用两个参数一,它将调用一个参数一(添加*.* 作为文件类型),然后添加调用者指定的文件类型。相反,让一个 arg 版本调用两个版本,默认为“*.*”。您可能只考虑一个可选参数。你没有提到你得到的错误,但我猜它与传递一个字符串列表有关,其中一个字符串是预期的
  • 一般来说,您应该重新排列所有内容。摆脱顶部的所有初始化,完全实现 3 参数构造函数,然后让两个和一个参数版本调用到下一个参数版本,在适用的情况下传递默认值。为什么在构造函数中调用FindFiles,它会改变对象的状态,还是返回它找到的文件。如果是后者,它属于实例方法。最后,您不要重载构造函数,一个类只能声明多个。
  • 当您使用第三个构造函数时,您当前的设置将调用 FindFiles() 3 次。

标签: c# constructor overloading constructor-overloading


【解决方案1】:

@CrazyNoun,正如@D-Shih 所说,您必须首先纠正类型不匹配问题。 以及关于构造函数:构造函数重载可以实现以多种方式达到单个目标(例如 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)
     {

     }

我为构造函数添加了列表支持。所以如果你想概括它是必要的。如您所见,无需为每个构造函数签名编写正文。实际上,其他构造函数会为主构造函数创建一些输入参数,然后他们会通过放置值并添加一些 默认值 来调用它以加快使用速度。

【讨论】:

  • 我对构造函数重载的实现顺序有一个思考问题。感谢您澄清这一点。
  • 这是编程世界,也是我们每天面临的挑战;)
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 2018-04-26
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多