[英]Method overloading in C# behaving unexpectedly when using params keyword
[英]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.