我想用Integer
创建自己的struct
。
这是一个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#
答案 0 :(得分: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
到 - struct
转换,在比较值时需要struct
到 - int
转换。< / p>
答案 1 :(得分:1)
您可以在代码中为 struct 指定值。我不知道你在这里使用什么语言语义,但在C#中,你不能这样做(在VB.NET中我也不知道)。
您可以执行您在代码中实际定义的内容,因此在get
和set
方法中定义属性和逻辑。
是的,有一个选项,因为Rawling建议在你的struct和integer之间覆盖强制转换操作符,但是请不要这样做,它是非常混淆,并且不清楚代码在那里发生了什么。
所以站在简单的属性逻辑上。
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
的值,我强烈建议避免。如果有一个包含属性值的字段,则必须始终等于调用者从属性本身获得的值。如果没有,它会造成混乱,并且在长期发展中:一团糟。
答案 2 :(得分:0)
您应该使用隐式转换运算符,如下所示:
public static implicit operator MyInt(int value)
{
return new MyInt(value);
}
这样,您可以使用MyInt a = 10;
,并在将值作为参数的构造函数中指定值10。
然后你应该重载其他运营商。
答案 3 :(得分:0)
.NET不提供类似“默认属性” 1 的任何内容。
作为@Rawling注释,您可以使用隐式转换运算符来允许赋值。
但最终你永远无法完全模拟编译器和.NET CLI中的内置类型,例如System.Int32
上的基本操作是单个CLI操作码,文字本身保存。
1 除了COM互操作之外,但VB中的COM(V6及之前版本)显示了为什么默认属性是个坏主意:必须有两个关键字(let
和{{1} })用于控制何时分配引用或默认属性。