变量在try ... catch中分配 - 范围

时间:2014-02-04 19:23:42

标签: c# scope unassigned-variable

我在try ... catch之前声明了一个变量并在try块中分配了它。我一直收到“fileDate”的未分配变量错误。

class Something
{
    string fACR = "BAK";
    int numbDays = 5;

    Public static void Main()
    {
        DateTime fileDate;
        try
        {
            fACR = args[0];
            numbDays = int.Parse(args[2]);
            fileDate = DateTime.Parse(args[1]);
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("INVALID COMMAND LINE ARGUMENTS! Follow Format:");
            Console.WriteLine("<farm_acronym> <yyyy-M-d> <# days>");
            Console.WriteLine(e);
        }

        inFileName = "U:/CANSO/Engineering/Farms/" + fACR +
            "/DailyDownloads/";
        switch (fACR)
        {
            case "DEM":
                inFileName = inFileName + "Report_Recombiner_" + fileDate.ToString("yyyy-MM-dd") + 
                    ".csv";
                break;
            default:
                inFileName = inFileName + "REPORT_Recombiner_" + fileDate.ToString("yyyy-M-d") + 
                    ".csv";
                break;
        }
    }
}

我在声明时试图使用它:

DateTime fileDate = null;

这也不起作用(DateTime不可为空)。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

更新:如果将错误记录到控制台后需要停止执行,则可以重新抛出异常。但代码仍然需要更多改进。

其他人解释了错误背后的原因。但我建议你重构代码并将try / catch输出并将其作为方法编写。但是下面的代码仍然不好。我不喜欢fACRnumbDays的定义方式。

class Something
{
    string fACR = "BAK";
    int numbDays = 5;

    Public static void Main()
    {
        DateTime fileDate = GetFileDate(args);


        inFileName = "U:/CANSO/Engineering/Farms/" + fACR +
            "/DailyDownloads/";
        switch (fACR)
        {
            case "DEM":
                inFileName = inFileName + "Report_Recombiner_" + fileDate.ToString("yyyy-MM-dd") + 
                    ".csv";
                break;
            default:
                inFileName = inFileName + "REPORT_Recombiner_" + fileDate.ToString("yyyy-M-d") + 
                    ".csv";
                break;
        }
    }
    public static DateTime GetFileDate(string[] args)
    {
        try
        {
            fACR = args[0];
            numbDays = int.Parse(args[2]);
            return DateTime.Parse(args[1]);
        }
        catch (Exception e)
        {
            Console.WriteLine("INVALID COMMAND LINE ARGUMENTS! Follow Format:");
            Console.WriteLine("<farm_acronym> <yyyy-M-d> <# days>");
            Console.WriteLine(e);
            throw;
        }
    }


}

答案 1 :(得分:0)

您必须为其指定一些值。如您所述,DateTime不是引用类型,因此它不能为null。因此,只需为其分配一些您知道无效的默认值 - 例如DateTime.MinValue。您可以稍后检查该值是否已分配。

当然,如果DateTime.MinValue有效的值,就像所有其他值一样,您应该使用更强大的方法来检查是否已进行分配 - 例如,通过使用可空的DateTime?。一般来说,.NET不赞成使用特殊值来标记无效数据 - 这正是Nullable类型的用途。

答案 2 :(得分:0)

你可以使用可以为空的DateTime,“DateTime?” (这明确地表示“也允许空值的DateTime”),或者在这种情况下可能更容易,只需在创建日期时为其分配标志值,如DateTime fileDate = DateTime.MinValue

当然,在这种情况下,似乎你只想在catch中返回并将fileDate放在try范围内 - 如果不是try / catch之外的范围内有fileDate变量有什么用呢?无论如何都要正确初始化?