.Net单数字类型

时间:2012-03-11 17:13:26

标签: .net

是否有可用于存储单个数字的数据类型,但没有别的。即0到9之一,没有别的。

我知道我可以使用shortintlong,但这是为了设计api而我想明确用户应该只给我一个数字

5 个答案:

答案 0 :(得分:4)

听起来像是enum类型的好候选人。

public enum Digit
{
    Zero, 
    One,
    Two,
    Three, 
    Four, 
    Five, 
    Six,
    Seven,
    Eight, 
    Nine
}

优点:

  1. 容易理解。
  2. 可直接转换为其基础类型
  3. 缺点:

    1. 理论上可以创建不属于[0 - 9]范围的实例,因为枚举实例可以获取基础类型的任何值。

答案 1 :(得分:4)

你可以通过几种方式去。

  • 创建您自己的值类型
  • 使用枚举 - 虽然
  • ,但似乎很难实现0到9的枚举
  • 如果它太大,只需使用短片并抛出异常......

我认为后者在API方面是最清晰的。如果它将在一个庞大而复杂的API中频繁使用,我只会创建一个新类型。

using System;
public class MyClass {
    public static void Main() {
        var test = new ApiClass();
        test.MyNum = 0; // OK
        test.MyNum = 1; // OK
        test.MyNum = 9; // OK

        test.MyNum = 10; // exception
        test.MyNum = -1; // exception
    }   
}

public class ApiClass {
    private short _myNum;
    public short MyNum {
        get {
            return _myNum;
        }
        set {
            if (value < 0 || value > 9)
                throw new ArgumentOutOfRangeException("Value must be between 0 and 9!");

            _myNum = value;
        }
    }
}

答案 2 :(得分:2)

这样的东西?

struct SingleDigit
{
    readonly byte singleDigit;

    public SingleDigit() 
    {
        singleDigit = 0;
    }

    public SingleDigit(byte value)
    {
        // NOTE: it's not a good practice to throw in a ctor
        if(value < 0 || value > 9)
            throw new ArgumenException();

        singleDigit = value;
    }

    // explicit byte to digit conversion operator
    public static explicit operator SingleDigit(byte b)  
    {
        Digit d = new SingleDigit(b);  // explicit conversion
        return d;
    }

    // explicit byte to digit conversion operator
    public static explicit operator SingleDigit(int b)  
    {
        Digit d = new SingleDigit((byte) b);  // explicit conversion
        return d;
    }

    // implicit digit to byte conversion operator
    public static implicit operator byte(SingleDigit digit)  
    {
        return digit.singleDigit;
    }

    public override string ToString()
    {
        return singleDigit.ToString();
    }

}

我添加了隐式(用于无损转换)和显式转换运算符,因此您可以像使用普通类型一样使用它,如下所示:

// explicit (possible loss)
SingleDigit digit = (SingleDigit) 9;

// implicit conversion (lossless)
int convertedDigit = digit;

优点:

  • 简单易用
  • 与其他任何基本类型(如byte,char,int
  • )一样工作和感受
  • 可以使用IConverter等轻松扩展,使其更像标准类型

缺点:

  • 构建和维护的工作量远远超过枚举
  • 可能更难以使其像现有类型一样强大和稳定

答案 3 :(得分:0)

不存在具有该功能的.Net类型。尽管

创建起来相当直接
public sealed class OneDigit {  
  public static readonly OneDigit One = new OneDigit(1);
  public static readonly OneDigit Two = new OneDigit(2);
  public static readonly OneDigit Three = new OneDigit(3);
  public static readonly OneDigit Four = new OneDigit(4);
  public static readonly OneDigit Five = new OneDigit(5);
  public static readonly OneDigit Six = new OneDigit(6);
  public static readonly OneDigit Seven = new OneDigit(7);  
  public static readonly OneDigit Eight = new OneDigit(8);
  public static readonly OneDigit Nine = new OneDigit(9);

  private readonly int _value;
  public int Value {
    get { return _value; }
  }

  private OneDigit(int value) {
    _value = value;
  }

  public static bool TryCreate(int value, out OneDigit digit) {
    if (value >=0 && value <= 9) {
      digit = new OneDigit(value);
      return true;
    }
    digit = null;
    return false;
  }
}

答案 4 :(得分:0)

我可能只是使用适当的参数/成员名称,并照常验证它。定义自定义类型的IMO过度工程化。

但是如果你想去自定义类型路由,我会按如下方式定义结构:

public struct DecimalDigit
{
    readonly byte _value;

    public DecimalDigit(int value)
    {
        if(value<0||value>9)
            throw new ArgumentException("value", "value must be between 0 and 9");
        _value = (byte)value;
    }

    public byte Value 
    {
        get 
        {
            return _value;
        }
    }

    public static explicit operator DecimalDigit(int i)  
    {
        return new DecimalDigit(i);
    }

    public static implicit operator byte(DecimalDigit digit)  
    {
        return digit.Value;
    }
}

还有一些接口实现(IEquatable<Digit>IComparer<Digit>IConvertible),相等比较,ToString(),...我在这里省略了。有了这些,它变得相当多的代码几乎没有收获。