在C#中的方法中定义枚举?

我主要是C ++背景,我正在学习C#。 所以,我需要一些C#习语和风格的帮助。

我试图在C#中编写一个小型文本文件解析方法,其中我需要一个具有三种状态的简单状态变量。 在C ++中,我会为状态变量声明一个这样的enum

 enum { stHeader, stBody, stFooter} state = stBody; 

…然后在我的解析循环中使用它,如下所示:

 if (state == stHeader && input == ".endheader") { state = stBody; } 

在C#中,我意识到在方法中声明enum是不可能的。 那么,为了清洁风格,我应该做些什么呢? 在方法之外声明这个内部enum ? 使用魔数1,2,3? 为此创建一个单独的类?

请帮我澄清一下我的困惑。

您可以获得的最接近的是类中的私有嵌套枚举:

 public class TheClass { private enum TheEnum { stHeader, stBody, stFooter } // ...the rest of the methods properties etc... } 

你也可以使用常量变量,但我更喜欢,我认为使用Enums是更好的代码风格

  public class Class1 { private enum TheEnum { stHeader, stBody, stFooter } public void SomeMethodEnum() { TheEnum state = TheEnum.stBody; switch (state) { case TheEnum.stHeader: //do something break; case TheEnum.stBody: break; case TheEnum.stFooter: break; default: throw new ArgumentOutOfRangeException(); } } public void SomeMethodConst() { int state = 1; const int Header = 1; const int Body = 2; const int Footer = 3; switch (state) { case Header: break; case Body: break; case Footer: break; default: throw new ArgumentOutOfRangeException(); } } } 

我也赞成Enum方法。 另外,虽然这不是这种情况,但是当你想将它们组合成标志时,它比CONSTS有优势,因为你有一个方法可以轻松地测试它。

你不能在方法范围中声明一个enum (重新讨论上面的Willem van Rumpt的答案 ),而是你可以声明一个内部私有类来进行状态跟踪并在你的类方法中重用它。 包含类或其客户端不需要知道该辅助类。

 class Program { private class Parser { public string pname = "ParserPam"; public enum pstate { rewind=-1, stdHeader, stBody, stFooter } public pstate state = pstate.stdHeader; //Implement state transition logic as methods public void tick() => this.state = pstate.stBody; public void tock() => this.state = pstate.stFooter; public void rewind() => this.state = this.state - 1; public override string ToString() { return $"{this.pname} state: {this.state}"; } } static void ParseFile(string filename) { Parser fp = new Parser(); //This object tracks your method's state Console.WriteLine(fp); // "ParserPam state: stdHeader" if (fp.state == Parser.pstate.stdHeader) { fp.tick(); // Transition // Do stuff } // Do more stuff Console.WriteLine(fp); // "ParserPam state: stBody" fp.tock(); Console.WriteLine(fp); // "ParserPam state: stFooter" fp.rewind(); Console.WriteLine(fp); // "ParserPam state: stBody" } static void Main(string[] args) { ParseFile( @"C:\Example" ); // Client call } } 

在这种情况下, Parser是您的私有内部类,其实例可以跟踪状态 – 它在Program之外是不可见的。 ParseFile是一种利用Parser的方法。

产量

 ParserPam state: stdHeader ParserPam state: stdBody ParserPam state: stFooter ParserPam state: stBody