3

我想Integerstruct.

这是一个简单的例子,Integer它的返回值被强制在 0 到 255 之间。

这些是伪代码,C# 不会编译它。

struct MyInt{
    private int p;
    default property theInt{  
        set{
            p = value;
        }
        get{
            if(p > 255) return 255; else if( p < 0) return 0;
            return p;
        }
    }
}

我的主要目标是使用以下代码:

MyInt aaa = 300;            //Grater than 255
if(aaa == 255) aaa = -300;  //Less than 255
if(aaa == 0) a = 50;

这可能与任何 .NET 语言有关吗?当然我更喜欢 C#

4

4 回答 4

2

正如我在评论中所说,您可以在结构和之间使用隐式转换int

internal struct MyInt
{
    private int p;

    public int BoundedInt
    {
        // As CodesInChaos points out, the setter is not required here.
        // You could even make the whole property private and jsut use
        // the conversions.
        get
        {
            if (p > 255) return 255;
            if (p < 0) return 0;
            return p;
        }
    }

    public static implicit operator int(MyInt myInt)
    {
        return myInt.BoundedInt;
    }

    public static implicit operator MyInt(int i)
    {
        return new MyInt { p = i };
    }
}

分配值时需要转换int,比较值时需要转换。structstructint

于 2013-04-08T09:12:38.040 回答
1

您在代码中为结构分配一个值。我不知道你在这里使用什么语言语义,但在 C# 中,你不能这样做(在 VB.NET 中,我知道的也不多)。

可以做什么你实际上已经在你的代码中定义了,所以定义一个属性和它里面的逻辑getset方法。

是的,正如 Rawling 建议的那样,有一个选项可以覆盖您的结构和整数之间的强制转换运算符,但请不要这样做,这非常令人困惑,并且从代码中不清楚那里发生了什么。

所以坚持简单的属性逻辑。

public struct MyInt{
    private int p = default(int);
    public int theInt{  
        set{
            var v = value; 
            if(v > 255) 
               v  =255; 
            else if(v < 0)
               v = 0;
            p = v;
        }
        get{              
            return p;
        }
    }

}

另请注意,在我的示例中,我颠倒了逻辑,将其放入 中set,就好像您以您提出的方式开发一样,在某些时候您的p, 将没有属性的值theInt,我强烈建议您这样做避免。如果有一个字段包含一个属性值,它必须始终等于调用者将从属性本身获得的值。如果不是,它会造成混乱,从长远来看:一团糟。

于 2013-04-08T09:08:05.473 回答
0

您应该使用隐式转换运算符,如下所示:

public static implicit operator MyInt(int value)
{
    return new MyInt(value);
}

这样,您可以使用MyInt a = 10;并在将值作为参数的 a 的构造函数中分配 10 的值。

然后,您应该通过重载其他运算符来继续。

于 2013-04-08T09:11:45.610 回答
0

.NET 不提供“默认属性” 1之类的东西。

作为@Rawling注释,您可以使用隐式转换运算符来允许赋值。

但最终,您永远无法完全模拟编译器和 .NET CLI 中的内置类型,例如,基本操作System.Int32是单个 CLI 操作码,而文字是本地保存的。


1除了在 COM 互操作中,但 VB(V6 及更早版本)中的 COM 显示了为什么默认属性是一个坏主意:必须有两个关键字 (letset) 用于分配以控制何时分配引用或默认属性。

于 2013-04-08T09:12:55.473 回答