如何声明结构体的默认属性

本文关键字:结构体 默认 属性 声明 何声明 | 更新日期: 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 };
    }
}

在赋值时需要intstruct的转换,在比较值时需要structint的转换。

在代码中为结构体赋值。我不知道你在这里使用什么语言语义,但在c#中,你不能这样做(在VB中)。NET(据我所知)。

可以做你在代码中已经定义的事情,所以在它的getset方法中定义一个属性和逻辑。

是的,有一个选项,罗林建议覆盖你的结构体和整数之间的强制转换操作符,但请不要这样做,这是非常混乱,不清楚从代码中发生了什么。

所以站在简单的属性逻辑上。

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和之前)显示了为什么默认属性是一个坏主意:必须有两个关键字(letset)用于赋值来控制何时分配引用或默认属性。