gpt4 book ai didi

c# - 方法声明中的变量 = null?这是什么意思,如何调用此方法?

转载 作者:行者123 更新时间:2023-11-30 19:52:29 27 4
gpt4 key购买 nike

今天我在浏览一些代码时偶然发现了以下方法声明

public List<Tuple<DataTable, string>> GetFileData(string directoryPath, string columnName = null)

我构建了类似的东西并尝试使用单个参数调用此方法,因为我已经声明了 columnName = null我可以有选择地在这里发送一个参数。显然不是这样。

我做了一个界面

public interface IExcelDataExtractor
{
List<Tuple<DataTable, string>> GetFileData(string directoryPath, string columnName);
}

并实现

public class ExcelDataExtractor : IExcelDataExtractor
{
/// <summary>
/// Loops through each file in given directory and extracts the data
/// </summary>
/// <param name="directoryPath">the directory in which to look for the excel files</param>
/// <param name="columnName">extractor will look for a sheet with the columName present to pull data from in case of multiple sheets, or a single sheet if null is passed</param>
public List<Tuple<DataTable, string>> GetFileData(string directoryPath, string columnName = null)
{
//Initiate list of tuples
List<Tuple<DataTable, string>> dataTableWithFileName = new List<Tuple<DataTable, string>>();

//Loop through each file in directory with a filter on *.xls*, this should catch both .xls and .xlsx
foreach (string file in Directory.EnumerateFiles(directoryPath, "*.xls*"))
{
DataSet ds;
DataTable dt;

ds = Read(file);
dt = ExtractDataByColumn(ds, columnName);
if (dt is null)
{
return null;
}

dataTableWithFileName.Add(Tuple.Create(dt, file));
}

return dataTableWithFileName;

}

/// <summary>
/// Reads excel files and sends data to dataset with each sheet being a data table within the sheet
/// </summary>
/// <param name="file">file to open and add to the dataset</param>
/// <returns>returns the dataset from the file</returns>
private DataSet Read(string file)
{
using (var stream = File.Open(file, FileMode.Open, FileAccess.Read))
{
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
{
var conf = new ExcelDataSetConfiguration
{
ConfigureDataTable = _ => new ExcelDataTableConfiguration
{
UseHeaderRow = true
}
};

return reader.AsDataSet(conf);
}
}
}


private DataTable ExtractDataByColumn(DataSet dataSet, string columnName = null)
{
if (!string.IsNullOrEmpty(columnName))
{
foreach (DataTable table in dataSet.Tables)
{
DataColumnCollection columns = table.Columns;
if (columns.Contains(columnName))
{
return table;
}

}
}
else
{
//If no columnName is given & more than 1 sheet is present, we want this to fail, else, return the single table
foreach (DataTable table in dataSet.Tables)
{
if (dataSet.Tables.Count > 1)
{
return null;
}
else
{
return table;
}
}
}

return null;
}
}

当我尝试以下列方式调用此方法时出现错误:

GetFileData(directory);

There is no argument given that corresponds to the required formal parameter 'columnName' of 'IExcelDataExtractor.GetFileData(string, string)'

当我这样调用它时,它起作用了:

GetFileData(directory, null);

所以我有两个问题:

  • 什么是放 = null在方法声明中的变量之后做什么?
  • 如果我可能还需要发送相应的 null,为什么还需要这个呢?什么时候调用这个方法?

最佳答案

在方法声明中将 = null 放在变量后面有什么作用?

它使调用方法时可选。所以你可以像这样调用这个方法:

GetFileData("path", "columnName")

或者像这样:

GetFileData("path")

两者都是有效的。在第二种情况下,columnName 将为空。

如果我可能在调用此方法时仍需要发送相应的 null,为什么还需要这样做?

希望我已经回答了这个问题? :)

除了使用 NULL,您还可以使用一个值...

GetFileData(string directoryPath, string columnName = "foobar")

在这种情况下,如果在调用时没有提供,“foobar”将是默认值。

编辑:

啊! IExcelDataExtractor。某处有一个接口(interface)需要第二个参数。你能告诉我们那个界面吗?

编辑 2:

IExcelDataExtractor 是一个接口(interface)。接口(interface)就像一个契约(Contract)。任何实现它的类都必须具有在接口(interface)中创建的方法。

IExcelDataExtractor 中,“GetFileData(string, string)”方法没有将第二个字符串定义为可选。这意味着即使实际方法可能会尝试使其成为可选的,它也无法覆盖 IExcelDataExtractor 中的原始定义(即:契约)。

这就是为什么在没有第二个参数的情况下调用 GetFileData 时出现错误的原因。

关于c# - 方法声明中的变量 = null?这是什么意思,如何调用此方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com