使用仅在if语句中赋值的变量

本文关键字:赋值 变量 语句 if | 更新日期: 2023-09-27 18:18:47

我使用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));
}

使用仅在if语句中赋值的变量

null赋给变量:

ExcelPackage assetTemplate = null;
ExcelWorksheet assetWorkbook = null;

编译器正在抱怨,因为没有办法让它知道控制流将进入检查(true部分)和您的字段/变量将明确分配。因此产生了错误。

你可以通过指定这些字段的默认值来解决这个问题,

ExcelPackage assetTemplate = default(ExcelPackage);
ExcelWorksheet assetWorkbook = default(ExcelWorksheet);

或指定其他部分:

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明确赋值- MSDN

default值初始化。

ExcelWorksheet assetWorkbook = default(ExcelWorksheet);

在c#中,必须保证在使用局部变量之前初始化它。在这种情况下,如果第一个if失败,assetWorkbook将永远不会被赋值,这意味着编译器不能保证它在使用之前被初始化。

如果你给他们一个初始值,甚至null,那么你的代码将编译-只要记住,如果值是null,那么你受制于NullReferenceException,如果它从来没有得到一个真正的值,所以确保你要么先做一个空检查,或者100%确定你给了它一个值。

您可以使用默认值(参见其他答案),但这看起来像是缺少功能组合的示例。如果你有一个类似于

的函数
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));
}

永远都是安全的