如何声明结构体的默认属性
本文关键字:结构体 默认 属性 声明 何声明 | 更新日期: 2023-09-27 18:08:13
我想用struct
创建我自己的Integer
。
下面是一个简单的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#
正如我在评论中所说的,您可以在您的结构和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
的转换。
在代码中为结构体赋值。我不知道你在这里使用什么语言语义,但在c#中,你不能这样做(在VB中)。NET(据我所知)。
可以做你在代码中已经定义的事情,所以在它的get
和set
方法中定义一个属性和逻辑。
是的,有一个选项,罗林建议覆盖你的结构体和整数之间的强制转换操作符,但请不要这样做,这是非常混乱,不清楚从代码中发生了什么。
所以站在简单的属性逻辑上。
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
的值,我强烈建议避免。如果有一个包含属性值的字段,它的必须总是等于调用者将从属性本身获得的值。如果没有,它会造成混乱,并且在长期开发中:混乱。
应该使用隐式转换操作符,如下所示:
public static implicit operator MyInt(int value)
{
return new MyInt(value);
}
这样,您可以使用MyInt a = 10;
,并在以该值作为参数的a的构造函数中赋值10。
然后应该重载其他操作符。
。. NET没有提供任何类似"默认属性"1的东西。
正如@Rawling所说,你可以使用隐式转换操作符来允许赋值。
但是最终你永远不能完全模拟编译器和。net CLI中的内置类型,例如System.Int32
上的基本操作是单个CLI操作码,字面值是本地保存的。
1除了在COM互操作中,但是VB中的COM (V6和之前)显示了为什么默认属性是一个坏主意:必须有两个关键字(let
和set
)用于赋值来控制何时分配引用或默认属性。