这个'else`语句在哪里结束?

pfi*_*rno 0 delphi if-statement delphi-7

试图将这段Delphi代码转换为,C#并且我elseif/else语句的以下部分实际结束的地方感到困惑.以下是代码的确切格式:

 try
   Root:=ExtractFileRoot(FileName);
   ErrorStr:=ExtractFileRoot(FileName)+' invalid name';
   if not GetNextNumericSegment(Root,Segment) then exit;  
   if length(Segment) = 4 then
   begin
      Year:=StrToInt(Segment);
      GetnextNumericSegment(Root,Segment)
   end
   else // Where does this else statement end?
       Year:=Defaultyear;
    ErrorStr:=ExtractFileRoot(FileName)+' invalid';
   if Length(Segment) <> 3 then exit;
   Jday:=StrToInt(Segment);
    ErrorStr:=ExtractFileRoot(FileName)+' Bad File';
   if not GetNextNumericSegment(Root,Segment) then exit;  // bad Time of day
   GetTimeFromFileName:=EncodeDate(Year,1,1)+Jday-1+
                        EncodeTime(StrToInt(Copy(Segment,1,2)),StrToInt(Copy(Segment,3,2)),StrToInt(Copy(Segment,5,2)),0);
 except
       GetTimeFromFileName:=0;
 end;
Run Code Online (Sandbox Code Playgroud)

我知道你不必使用开头/结尾,但到目前为止我在这段代码中看到的所有内容都使用了它.我也看了,你不需要;if语句的一部分,并且第一;else是底了else.

我的猜测是,根据一切else和达except是金else声明.

注意:如果我可以实际调试,这将很容易,但不幸的是,我只是被给予代码和函数的片段,无需真正的上下文进行转换.

LU *_* RD 10

我建议阅读文件,如果声明.

之后else发表声明.每个语句(结构化或非结构化)都可以用分号分隔符结束;.

声明可以是复合的.在这种情况下,它被包含在一个begin/end结构中.

在你的情况下,else语句结束Year := DefaultYear;


我建议总是使用'​​end/end'对,即使语句是单行.代码更具可读性,如果您稍后添加一行,则会出现更少的错误.

  • "总是使用'​​开始/结束'对是一个很好的编码标准"谁说?我认为这是基于意见/味道的.看看Delphi的源代码. (5认同)
  • 我个人发现使用更多开始/结束对的代码比不必要的更难阅读.如果声明可以简化为单一声明,我个人会省略它们.但我同意kobik这是一个偏好.我理解这样的论点,即始终使用开始/结束以及为什么这样做是好的,但我认为它使代码比必要的更冗长. (4认同)
  • FWIW,```是一个分隔符而不是终结符.陈述不一定必须跟着`;`. (3认同)
  • @kobik,我看到了太多的错误和对此的误解.使用开始/结束是我的建议:-) (3认同)
  • @kobik:*看看Delphi的源代码*往往是一个非常糟糕的主意.它充满了不一致和糟糕的编程习惯,以及在某些情况下编写得很糟糕的代码. (3认同)

Wos*_*osi 6

一个else分支包含

所以在你的情况下,这是整个else分支.

Year:=Defaultyear;
Run Code Online (Sandbox Code Playgroud)

附注:格式化在这里无关紧要.它仅用于可读性目的.只有begin并且end确实会更改else分支内的语句数量.