使用仅在if语句中指定的变量

时间:2014-08-20 14:47:03

标签: c# variables

我正在使用C#和VS2013以及.Net 4.5.2。

我创建一个变量,如果某个其他变量是布尔值设置为true,则为其赋值。稍后使用相同的变量,看看我是否应该处理涉及该变量的任何内容。

FileInfo newFile;
ExcelPackage assetTemplate;
ExcelWorksheet assetWorkbook;

if (load.assetDelivery) // Bool in another class
{
   newFile = new FileInfo(load.assetDeliveryTemplate);
   assetTemplate = new ExcelPackage(newFile);
   assetWorkbook = assetTemplate.Workbook.Worksheets[1];
}

// In this function later on, assetWorkbook and assetTemplate are causing errors
// Error    1   Use of unassigned local variable 'assetWorkbook'    
if (load.assetDelivery)
{
   assetWorkbook.Cells.AutoFitColumns();
   destination = load.exportFileDestination + load.assetDeliveryName +              DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
   assetTemplate.SaveAs(new FileInfo(destination));
}

5 个答案:

答案 0 :(得分:2)

null分配给您的变量:

ExcelPackage assetTemplate = null;
ExcelWorksheet assetWorkbook = null;

答案 1 :(得分:2)

编译器抱怨,因为它无法知道控制流将进入检查(真实部分),并且您的字段/变量将明确分配。因此错误。

您可以通过分配这些字段默认值

来解决此问题
ExcelPackage assetTemplate = default(ExcelPackage);
ExcelWorksheet assetWorkbook = default(ExcelWorksheet);

或指定else部分:

if (load.assetDelivery) // Bool in another class
{
   newFile = new FileInfo(load.assetDeliveryTemplate);
   assetTemplate = new ExcelPackage(newFile);
   assetWorkbook = assetTemplate.Workbook.Worksheets[1];
}
else
{
    ExcelPackage assetTemplate = default(ExcelPackage);
    ExcelWorksheet assetWorkbook = default(ExcelWorksheet);
}

请参阅:5.3 Definite assignment - MSDN

答案 2 :(得分:0)

只需使用default值初始化它。

ExcelWorksheet assetWorkbook = default(ExcelWorksheet);

答案 3 :(得分:0)

在C#中,您必须保证在使用本地变量之前初始化它。在这种情况下,如果您的第一个assetWorkbook失败,if将永远不会被分配值,这意味着编译器无法保证在使用之前对其进行了初始化。

如果你给他们一个初始值,即使是null,那么你的代码就会编译 - 只要记住,如果值为null,那么你需要{{1}如果它永远不会得到真正的值,那么请确保先进行空检查,或者100%确定你给它一个值。

答案 4 :(得分:0)

您可以使用默认值(c.f。其他答案),但这看起来像一些缺少功能组合的示例。如果你的功能看起来像

public void CreateSheet(string exportDestination, string assetName) 
{
    FileInfo newFile = new FileInfo(load.assetDeliveryTemplate);
    ExcelPackage assetTemplate = new ExcelPackage(newFile);
    ExcelWorksheet assetWorkbook = assetTemplate.Workbook.Worksheets[1];

    assetWorkbook.Cells.AutoFitColumns();
    destination = exportDestination + assetName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
    assetTemplate.SaveAs(new FileInfo(destination));

}

总是安全的。