代码之家  ›  专栏  ›  技术社区  ›  Mohsen Sarkar Alex

如何声明结构的默认属性

  •  3
  • Mohsen Sarkar Alex  · 技术社区  · 13 年前

    我想创建自己的 Integer 具有 struct .

    下面是一个简单的例子 整数 返回值被迫在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 回复  |  直到 13 年前
        1
  •  2
  •   Rawling isekaijin    13 年前

    正如我在评论中所说,你可以在你的结构和 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 };
        }
    }
    

    你需要两个 整数 -至- struct 当您指定值和 结构 -至- 整数 比较值时的转换。

        2
  •  1
  •   Tigran    13 年前

    结构 在您的代码中。我不知道你在这里使用什么语言语义,但在C#中,你不能做到这一点(在VB.NET中,也不像我所知道的那样)。

    你做了什么 可以 按照您在代码中实际定义的操作,因此定义一个属性及其内部的逻辑 get set 方法。

    是的,正如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;
            }
        }
    
    }
    

    还请注意,在我的例子中,我颠倒了逻辑,我把它放进 设置 ,就好像你以你所呈现的方式发展,在某个时候 p ,将不具有属性的值 theInt ,我强烈鼓励大家避免这样做。如果有一个字段包含属性值,那么它必须是 总是 等于调用者将从属性本身获得的值。如果不这样做,就会造成混乱,而且在长期发展中会造成混乱。

        3
  •  0
  •   John Willemse    13 年前

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

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

    通过这种方式,您可以使用 MyInt a = 10; 并且在将该值作为参数的a的构造函数中分配值10。

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

        4
  •  0
  •   Community Mohan Dere    9 年前

    .NET不提供任何类似于“默认属性”的内容 1. .

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

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


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

    推荐文章