2011-10-11 90 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(); 
    } 
} 
相關問題