在没有枚举的情况下在C#中实现自己的数据类型?

时间:2014-09-23 18:26:36

标签: c# c++ types enums hard-coding

内置数据类型和用户定义数据类型之间的主要区别在于:内置数据类型可以接受文字值(直接插入代码中的值,此过程也称为硬编码)。

因此可以创建与boolean相同的自定义数据类型,它接受三个值: 是/否/也许没有使用枚举。

如下面的代码:

MyCustomBoolean a = maybe;

我问上面的问题,因为我想了解C#中的内置数据类型是用核心语言(例如C ++ int,char ...)指示的还是没有?

--- ---更新

关于第二个问题,让我提出一个问题,使第二个问题更清楚:

我知道例如string是System.String的别名,但C#中的纯字符串是否在没有System.String的情况下工作?

3 个答案:

答案 0 :(得分:2)

没有办法按照您的要求完全执行此操作。但是,您可以在C#中创建constant fields,它可以完成此结果(命名值)但只能使用integral types或字符串 - 换句话说,您已经可以用于编译时常量的事情。这对于Magic Values来说尤其有用。

public const string Maybe = "Maybe";
public const int Maybe = 0;

解决此问题的一种方法是初始化静态readonly字段或属性,尽管它不能用作真正的常量。例如

public static readonly MyCustomBoolean Maybe { get { return new MycustomBoolean(); } }
public static MyCustomBoolean Maybe = new MyCustomBoolean();

答案 1 :(得分:0)

对于这种特定情况,您可以使用可以为空的bool。 通过以下典型操作:

bool? b = null
if (b.HasValue)
if (b.Value)
b = true

可能为null,或者HasValue == false

答案 2 :(得分:0)

文字是C#语言的一个特征。您无法创建新文字。

您可能对不同的编程语言感兴趣,例如Nemerle,它允许您创建用户定义的文字,例如此XML文字: https://github.com/rsdn/nemerle/wiki/XML-literals

枚举和常量通常填补C#的空白。对于更复杂的结构,您经常会看到使用一些流畅的API。

当然,我们可以看到C#中缺少此功能意味着提供一种自然的方式来定义查询意味着需要更改C#语言规范以支持LINQ。如果C#具有与Nemerle类似的元编程特性,那么他们可以在不改变语言语法的情况下完成与LINQ相同的目标。