gpt4 book ai didi

C#:整数集的类型安全(例如枚举)

转载 作者:行者123 更新时间:2023-11-30 20:03:21 25 4
gpt4 key购买 nike

我有一个案例,我有几组数字(寄存器值)。我想提高可读性并检查适当的类型(只有某些值在某些函数中有意义)。

在我的特定实现中,我将它们设为枚举 - 所以我现在有一组枚举。

现在我似乎已经结束了这种方法,因为我想将它们分成用于某些应用程序的有效枚举集 - 因此函数 A 可以例如将(来自)enumA、enumB 和 enumC 的值作为输入,但不是 enumD,它是对不同功能的描述。

我已经研究过接口(interface)中的枚举和枚举继承——两者都是死胡同,在 C# 中是不可能的。

我现在想知道这个问题的解决方案会是什么样子。我想对可能的值进行智能感知,并且还具有某种类型安全性,这样我就不能(好吧,至少在没有恶意转换的情况下不能)输入错误的值。

如何实现?

(可能的解决方案是简单地编写几个采用几个不同枚举的函数 - 仍然可行但不是很好,或者类似于 Is there a name for this pattern? (C# compile-time type-safety with "params" args of different types) - 两者似乎都不太好。)

最佳答案

一种选择是废弃枚举并使用您自己设计的类来模仿枚举。设置它们需要做更多的工作,但一旦完成,使用起来就会很容易,并且能够拥有您所描述的功能。

public class Register
{
private int value;

internal Register(int value)
{
this.value = value;
}

public static readonly Register NonSpecialRegister = new Register(0);
public static readonly Register OtherNonSpecialRegister = new Register(1);

public static readonly SpecialRegister SpecialRegister
= SpecialRegister.SpecialRegister;
public static readonly SpecialRegister OtherSpecialRegister
= SpecialRegister.OtherSpecialRegister;

public override int GetHashCode()
{
return value.GetHashCode();
}
public override bool Equals(object obj)
{
Register other = obj as Register;
if (obj == null)
return false;

return other.value == value;
}
}

public class SpecialRegister : Register
{
internal SpecialRegister(int value) : base(value) { }

public static readonly SpecialRegister SpecialRegister = new SpecialRegister(2);
public static readonly SpecialRegister OtherSpecialRegister = new SpecialRegister(3);
}

鉴于此,您可以使用如下方法:

public static void Foo(Register reg)
{
}

这可以采用任何寄存器,并且可以这样调用:

Foo(Register.NonSpecialRegister);
Foo(Register.OtherSpecialRegister);

那么你可以有另一种方法,例如:

public static void Bar(SpecialRegister reg)
{
}

它不能接受 Register.NonSpecialRegister,但可以接受 Register.OtherSpecialRegisterSpecialRegister.SpecialRegister

关于C#:整数集的类型安全(例如枚举),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com