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