2011-10-11 87 views
4

我想创建一个新类型,我。 E:是否可以在C#中创建一个新类型?

[sbyte (1 Byte) Value-range :  -128 to +127] 
[byte (1 Byte) Value-range :   0 to +255]  
[short (2 Byte) Value-range :  -32768 to +32767] 
[ushort (2 Byte) Value-range :   0 to +65535]  
[int (4 Byte) Value-range : -2147483648 to +2147483647] 
[uint (4 Byte) Value-range :   0 to +4294967295] 
. 
. 
. 
etc. 

现在我想创建皮棉(LowInt)输入范围从0到20万,所以我不想使用UINT或INT。

C#有可能吗?

谢谢!

+1

虽然可以创建它,只是好奇,如果有任何理由,你不想使用'int'的呢? – Amry

+0

我研究了这个确切的事情,但没有真正的方法来模拟整体/原始类型。你可以模拟它的某些部分(使用struct,实现关键接口等),但是你不能完全理解。 – Joe

+0

它几乎听起来像是一个'FixedRange'类,其中的值只能在'[min,max]'之间,或者是关闭和开放端点的排列。如果这就是你想要的,创建这样的事情是很容易的。 –

回答

2

这是不可能在一个内置的方式,用简单的语言,例如int<5000,20000>

虽然可能有更复杂的定义,它是不容易的。这是很难确定和定义所有你想要的语义,如:

  • 转换为其他类型的范围
  • 转换,从内置的数字类型
  • 上溢/下溢
  • 应该发生什么
  • 应该得到的类型的范围是算术之后什么是执行

这样的解决方案也没有覆盖情况下,你会想要一个参数的类型基于另一个PARAM范围限制eter的价值。

另一种方法是使用类似Code Contracts定义合约代码,以便你可以做任意的静态(编译时间)验证。

编辑:删除链接SpecSharp。它看起来就像是用代码契约取代...

+1

非常有帮助的信息,谢谢! – Racooon

+0

您可能还想看看运算符重载:http://msdn.microsoft.com/en-us/library/aa288467.aspx – Polynomial

+0

@Polynomial:虽然你说的是真的,但我假设任何人试图替换内置的数字类型已经知道如何做到这一点。如果你更仔细地阅读我的答案,我基本上是在说“不要打扰 - 这是一个非常糟糕的主意”。我知道,因为我已经尝试过了:) –

3

是的,这是类的用途。现在,你不能创建一个新的“内建”类型。语义可能不完全一样,但我猜你不会太在意这些差异。

+1

我的意思是原始类型 – Racooon

+1

他可以为它创建一个结构体作为一个值类型,并且可以使语法和语义与内置类型非常相似。 –

0

你也可以使用结构来创建一个“类型”,但你不能创建一个基本类型。

0

您可以创建一个对象,并处理您的情况,如果你希望它更像一个原始的尝试使一个结构

0

这是没有用的。您的CPU架构定义了它可以同时处理的数据块和用于什么目的。即使你创建了一个只允许不同最小最大值的类型(你可以在一个类和运算符重载中实现),它在内存和性能方面都不会更高效。

如果你想简单地执行一些语义,这里的东西应该在你领导正确的方向(这是不完整,缺乏支持,为检查选中关键字)。

struct MyInt 
{ 
    static uint max = 200000; 
    readonly uint i; 
    public MyInt(uint i) { 
     this.i = i; 
    } 

    public static implicit operator MyInt(uint j) { 
     if(j > max) 
      throw new ArgumentException(); 
     return new MyInt(j); 
    } 

    public static MyInt operator +(MyInt i, uint j) { 
     try { 
      return new MyInt(i.i + j); 
     } 
     catch(ArgumentException) { 
      throw new OverflowException(); 
     } 
    } 

    public override string ToString() 
    { 
     return i.ToString(); 
    } 
} 
相关问题