是否有可用于存储单个数字的数据类型,但没有别的。即0到9之一,没有别的。
我知道我可以使用short
,int
或long
,但这是为了设计api而我想明确用户应该只给我一个数字
答案 0 :(得分:4)
听起来像是enum类型的好候选人。
public enum Digit
{
Zero,
One,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine
}
优点:
缺点:
答案 1 :(得分:4)
你可以通过几种方式去。
我认为后者在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;
优点:
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()
,...我在这里省略了。有了这些,它变得相当多的代码几乎没有收获。