如何声明结构的默认属性

时间:2013-04-08 09:04:16

标签: c# .net vb.net

我想用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#

4 个答案:

答案 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中我也不知道)。

可以执行您在代码中实际定义的内容,因此在getset方法中定义属性和逻辑。

是的,有一个选项,因为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} })用于控制何时分配引用或默认属性。