【问题标题】:enums setter and getter枚举 setter 和 getter
【发布时间】:2017-10-30 00:58:27
【问题描述】:

我今天可以使用以下构造(无法编译)

public enum RecordedOrPlayed
{
    None {get,private set}
    Recorded,
    Played
}
enum SoundStatus = SoundStatus.None

这会有用吗?

编辑 - 回应评论

解释:

我想要一种方法来获得无法使用的首次价值。 II 有一个 Sound 类,它在创建时什么也没做。声音根据其状态做了不同的事情。该类可能被其他程序员使用。一旦它已经录制或播放,它就永远不会返回到无。当它不是一个选项时,我不希望智能感知提示无。从 C#7 开始,我们可以为属性做到这一点

public string str {get; private set;} = "First time only";

我意识到它可以用类似...的东西来完成

    public RecordedOrPlayed recordedOrPlayed
    {
        get { return _recordedOrPlayed; }
        set
        {
            if (value == RecordedOrPlayed.None)
                throw new ArgumentException("yada yada");
            _recordedOrPlayed = value;
        }
    } 

...但是丑陋,一目了然,又增加了一个变量,需要10行代码来替换setter。

【问题讨论】:

  • 你在问什么? enum 值是常量。您是说能够更改特定枚举常量的基础整数值会很有用吗?我怀疑你会为此找到很多共识。如果您需要类似的东西,我会创建一个包含 int 属性 NoneRecordedPlayed 等的类。
  • 您的代码无法编译,因为语法和用法明显错误(如您所述)。你的问题也不清楚……
  • @BobKaufman 你们都是对的。我意识到有多种方法可以做同样的事情,但它不能解决智能感知问题。我可以使用布尔值吗?或 int?,带有访问器的结构或其他一些乍一看难以理解的迂回代码。见上文
  • @svek 见上,每条评论只能通知一个人
  • @Paulustrious - 请访问我们的帮助页面。在您的评论中,使用反引号(美国 QWERTY 键盘上的未移位波浪符“~”)分隔关键字。 “布尔?还是整数?”是模棱两可的。 bool?和bool? 表示不同的东西。前者是结束一个问题,后者是Nullable<bool>的简写

标签: c# enums getter-setter


【解决方案1】:

截至 20 分钟,有 8 人投反对票,所以我认为这个问题不是由我回答的,而是由大众舆论回答的。这可能不会被合并到 C#8 中

此外,这个问题和另一个问题导致我被禁止进一步提问。我知道这是由我的同龄人组成的陪审团,但我不认为这个问题如此令人发指,以至于值得惩罚

【讨论】:

    【解决方案2】:

    枚举只是带有标签的常量整数值...

    所以

    public enum RecordedOrPlayed
    {
        None,
        Recorded,
        Played
    }
    

    最终会编译成

    public const int RecordedOrPlayed_None = 0;
    public const int RecordedOrPlayed_Recorded = 1;
    public const int RecordedOrPlayed_Played = 2;
    

    您试图通过使用实现的目标,永远不会编译为您使用 getter 和 setter 讨论的那种行为,因为这根本不是枚举的设计目的。

    这个严重的误解是你所有反对票的来源。

    您的建议是对 IntelliSense 隐藏 enum,这相当于说,隐藏 public const... 您可以看到人们为什么不理解您的问题。

    【讨论】:

    • 我明白,但它可以通过多种方式完成并且是有效的语法。
    • 超时。 @Svec 我理解,但它可以通过各种方式完成,并且是有效的语法,例如 { [EnumNoSet] None, [EnumSet (ie default)] Recorded, Played} 编译器可以做任何它想做的事情。当你有Task<string> RecordAsync().....return "Ignore" 时,看看它如何处理返回值;顺便说一句,我的问题措辞如此简短,以免推动我的“为什么”而让其他人给出他们的“为什么”和“为什么不”。那是一个错误。 BobK 我会阅读帮助。
    • @Paulustrious 那么为什么不使用返回枚举的工厂模式呢?它似乎可以满足您的要求。
    • 没想到。另一个可能使用的语法错误是public const int RecordedOrPlayed_None =>1;。如果编译器生成了public static int RecordedOrPlayed_None => 0;,那么可以编译的东西并不重要,因为有很多解决方法。感谢你的贡献。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2016-02-24
    • 2017-09-07
    相关资源
    最近更新 更多