通过类名直接加入成员

时间:2018-12-28 13:53:50

标签: c# class oop struct

我正在尝试在c#中创建ufloat类/结构。对我来说,这更是一个挑战,但可以帮助我控制代码中的某些值。在尝试了几种方法之后,我终于有了一种可行的方法:

public struct ufloat
{
    public float value
    {
        get{ return value; }
        set
        {
            if(value < 0)
            {
                this.value = 0;
            }
            else
            {
                this.value = value;
            }
        }
    }
}

问题是,我希望它的行为类似于典型的基本类型:

ufloat n = 5;
n += 1;

经过一番思考,我尝试重载'='运算符,但这是不可能的。现在我没主意了。这就是为什么我问,你怎么改变这个:

ufloat x; x.value = 1;

对此:

ufloat x = 0; x = 1;

(很抱歉,如果我真的失去了一些简单的东西,但是我是一个自学成才的“程序员”,并且对c#还是陌生的。我起初是学习c ++的,从低级转到高级对我来说并不容易)

2 个答案:

答案 0 :(得分:5)

您不能重载=运算符,但是可以重载+运算符,然后重载+=运算符(我相信您的意思不是=+ )将以合理明显的方式工作。不过,您还需要将float的隐式转换添加到您的结构中。

我强烈建议不要使结构可变-而是让+运算符返回一个 new 值。这将使其表现得与其他所有基本类型一样,并且与大多数其他结构一样。我还要将其重命名为USingle,以遵循常规的.NET命名约定(其中Singlefloat的CLR名称)。您不能为float这样的名称添加自己的C#别名。

我怀疑您的类型会想要

  • 接受Single的构造函数
  • float之间的转换(请注意,通常隐式转换不应引发异常-您也许可以忽略它,但我不确定...)
  • 算术运算符(float+-*的重载)
  • 覆盖/ToStringEquals
  • GetHashCodeIComparable<USingle>的实现

如果您将两个“大正浮点数”值加在一起,则应该考虑要发生什么-意图是您的新类型能够支持比IEquatable<USingle>更大的正值,或者是只是“ float,但总是非负的?”

答案 1 :(得分:0)

您不能重载=运算符,但可以编写隐式强制类型转换,例如,这是用于强制转换int的类型:

public class ufloat
{
    public float value { get; }
    public ufloat(int val) {  value = Math.Abs(val); }
    public static implicit operator ufloat(int input) 
    {
         return new ufloat(input);
    }
}

现在,如果您为其分配一个int值,它将隐式转换为ufloat:

ufloat x = -5;