【问题标题】:C# How to use get, set and use enums in a classC#如何在类中使用get、set和使用枚举
【发布时间】:2014-04-15 14:50:33
【问题描述】:

我有一个使用类存储设置的程序。我需要它来使用 set 和 get 功能来更改和存储设置。我已经尝试过了,但我没有让它工作。谁能帮我解决这个问题?

    private enum _Difficulty { Easy, Normal, Hard };

    public void SetDifficulty(Difficulty)
    {
        _Difficulty = Difficulty;
    }

    public enum GetDifficulty()
    {
        return _Difficulty;
    }

有没有办法在有getset 的类中使用enums

boolint 我也需要这个。

【问题讨论】:

  • 这里似乎存在对基本 C# 概念的基本误解,我不确定任何答案都可以解决。您的出发点是什么?
  • 枚举不是变量——它是一种类型。您不能使用它来存储在运行时更改的信息。

标签: c# class enums int boolean


【解决方案1】:

这里有几个问题:

  • 您的枚举是私有的,但您的方法是公开的。因此,您不能让您的方法返回类型为枚举类型,或者具有该类型的参数
  • 您的 SetDifficulty 方法的参数只有 Difficulty - 是指参数名称还是类型?
  • 您的SetDifficulty 方法正在尝试设置类型而不是字段
  • 您的 GetDifficulty 方法正在尝试使用 enum 作为返回类型,然后返回 类型 而不是字段

基本上,您似乎对 enum 声明所声明的内容感到困惑 - 它不是声明一个 字段,而是声明一个 type(并指定命名的该类型的值是)。

我怀疑你想要:

// Try not to use nested types unless there's a clear benefit.
public enum Difficulty { Easy, Normal, Hard }

public class Foo
{
    // Declares a property of *type* Difficulty, and with a *name* of Difficulty
    public Difficulty Difficulty { get; set; }
}

如果你真的想让你的代码看起来像 Java 而不是 C#,你可以使用 get/set 方法:

public enum Difficulty { Easy, Normal, Hard }

public class Foo
{
    private Difficulty difficulty;

    public void SetDifficulty(Difficulty value)
    {
        difficulty = value;
    }

    public Difficulty GetDifficulty()
    {
        return difficulty;
    }
}

【讨论】:

  • 乔恩,我喜欢公共属性的第一个变体,但在命名时遇到了麻烦。你能为这种类型的东西推荐一个好的命名约定吗?
  • @LouiseEggleton:我不太清楚你的意思。命名变体?为物业命名?命名包含该属性的类?
  • 在包含类的唯一目的是设置枚举的情况下命名包含属性的类。在我想为枚举创建一个构造函数的情况下使用这种模式,当然枚举不能有构造函数,所以我将它们包含在一个类中。在这种情况下调用类 DifficultySetter 或类似的东西似乎很蹩脚。跨度>
  • @LouiseEggleton:说实话,这感觉有点奇怪。这里的上下文是“一个类存储设置”,表明它不仅仅是这个属性。我想我需要看到更多真实情况的背景才能就名称提出建议。
【解决方案2】:

您的代码尝试为Difficulty 分配一个值,而实际上Difficultyenum 类型的名称。我会鼓励使用 getter 和 setter 作为属性:

public enum Difficulty { Easy, Normal, Hard };

private Difficulty _difficulty;

public Difficulty CurrentDifficulty
{
    get { return _difficulty; }
    set { _difficulty = value; }
}

通过这种方式,您可以在 setter 中为特殊条件添加额外的代码。要使用它,您只需执行以下操作:

//set
CurrentDifficulty = Difficulty.Easy;

//get
Difficulty theDifficulty = CurrentDifficulty;

【讨论】:

    【解决方案3】:

    使用enum 关键字指定枚举后,该枚举将充当类型,就像classstruct 一样。

    以下是使用自定义枚举实现属性的方法:

    public enum _Difficulty { Easy, Normal, Hard };
    public _Difficulty Difficulty { get; set; }
    

    【讨论】:

      【解决方案4】:

      您要使用的枚举需要是公开的。您还需要该枚举的一个实例来存储您正在设置的值,您当前正在将其设置为您的枚举声明。然后你想对你的类存储的内容和传入的内容使用相同的枚举类型。

      public enum Difficulty { Easy, Normal, Hard };
      
      public Difficulty { get; set; }
      

      【讨论】:

        【解决方案5】:

        这里有很多问题:

        1. 您的enum 是私有的,因此没有任何东西可以调用SetDifficulty 来为其提供来自enum 的值。事实上,编译器不允许这样做。
        2. SetDifficulty 的参数只是一个类型,它还需要一个变量名。也是编译器错误。
        3. 您正在尝试获取/设置枚举本身的值,而不是枚举类型的类级变量。这也不会编译。

        看起来你想这样做:

        public enum Difficulty { Easy, Normal, Hard }
        
        public Difficulty DifficultySetting { get; set; }
        

        请注意,我必须将属性名称更改为 DifficultySetting,因为它与枚举名称冲突。你的使用了下划线,这也可以解决这个问题。但是我总是发现下划线是针对私有成员的,如果你想使用代码来使用这个enum,那么它需要是公共的。用下划线之类的东西装饰公共成员会分散名称本身的语义。无论如何,语义取决于您的个人喜好,因此您可以根据需要修改这些名称。

        【讨论】:

          【解决方案6】:

          我不确定您是否正确使用它们。这可能会有所帮助...

          private enum Difficulty { Easy, Normal, Hard };
          private Diffuculty theDifficulty;
          
          public void SetDifficulty(difficulty d)
          {
              theDifficulty = difficulty;
          }
          
          public Difficulty GetDifficulty()
          {
              return theDifficulty;
          }
          

          【讨论】:

            【解决方案7】:

            枚举是一个类型而不是一个变量。像这样的东西会起作用:

            public enum Difficulty { Easy, Normal, Hard };
            
            private Difficulty _Difficulty;
            
            public void SetDifficulty(Difficulty difficulty )
            {
                _Difficulty = Difficulty;
            }
            
            public Difficulty GetDifficulty()
            {
                return _Difficulty;
            }
            

            或更简洁地作为自动属性:

            private Difficulty Difficulty {get; set;}
            

            请注意,如果您希望可以从公共方法访问枚举,则该枚举必须为 public

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-11
              • 2013-12-23
              • 1970-01-01
              • 2012-11-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多