C# 直接通过类名访问成员

C# 直接通过类名访问成员,c#,class,oop,struct,C#,Class,Oop,Struct,我试图在c#中创建一个ufloat类/结构。这对我来说更具挑战性,但可以帮助我控制代码中的一些值。在尝试了几种方法后,我终于找到了一种似乎有效的方法: public struct ufloat { public float Value { get{ return value; } set { if(value < 0) { this.value =

我试图在c#中创建一个ufloat类/结构。这对我来说更具挑战性,但可以帮助我控制代码中的一些值。在尝试了几种方法后,我终于找到了一种似乎有效的方法:

public struct ufloat
{
    public float Value
    {
        get{ return value; }
        set
        {
            if(value < 0)
            {
                this.value = 0;
            }
            else
            {
                this.value = Math.Abs(value);
            }
        }
    }
}
经过一番思考,我试图重载“=”运算符,但这是不可能的。现在我没有主意了。这就是为什么我要问,你如何改变这一点:

ufloat x; x.value = 1;
为此:

ufloat x = 0; x = 1;
?


(对不起,如果我丢失了一件很简单的东西,但我是一个自学的程序员,我对C是很新的。我首先学习C++,从低到高的水平对我来说并不容易。)< /P> < P>不能重载<代码> = /Cux>运算符,但是你可以重载<代码> +<代码>操作符,然后可以使用<代码> += < /Cord>操作符。(我相信你的意思是代替

=+
)将以一种相当明显的方式工作。不过,你还需要添加一个从
float
到结构的隐式转换

我强烈建议不要使结构可变,而是让
+
运算符返回一个新值。这将使它的行为与其他所有基本类型以及大多数其他结构类似。我还将其重命名为
USingle
,以遵循正常的.NET命名约定(其中,
Single
float
的CLR名称)。但是,您不能为
float
等名称添加自己的C#别名

我怀疑你的类型会想要:

  • 接受浮动的构造函数
  • float
    之间的转换(请注意,通常隐式转换不应引发异常-您可能希望忽略这一点,但我不确定…)
  • 算术运算符的重载(
    +
    -
    *
    /
  • 重写
    ToString
    等于
    GetHashCode
  • i可比较
    i可比较

如果将两个“大正浮点”值加在一起,您应该考虑一下您希望发生什么-您的新类型能够支持比
float
更大的正值,或者只是“
float
但始终是非负值”?

您不能重载
=
运算符,但您可以编写隐式强制转换,例如,这一个用于强制转换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;

您需要一个名称与属性不同的私有变量,否则
this.value=
集合{}
中的部分将再次调用
集合
,并且会出现堆栈溢出…您可以澄清一下-是
n=+1
真的是您的意思(新值为1)还是
n+=1
(您希望结果为6的位置)?@nyrguds谢谢你指出这一点…看来递归仍然困扰着我。@JonSkeet不,它是+=,我只是没有看到。哎呀。对不起。谢谢你的快速响应!但我只想知道一件事。为什么要使类型变为inmutable?这只是一种好的做法吗?@czajnikzrawy:对于值类型,是的,几乎总是这样。它使它们变得更容易我个人喜欢在很多情况下类的不变性,但几乎总是值类型的不变性。不,我只需要一个正浮点。没什么了。谢谢你写了这么一个信息丰富的答案!非常感谢!我以前没有想到过这个。这是克服=运算符重载的一个很好的方法。而且,这很有意义-有很多类型,其中很多需要单独关注。虽然这将允许转换本身,但它对
+=
@JonSkeet没有帮助。是的,我知道。我有点把它放在我的问题中,因为我想展示你可以用类型做的典型事情。但是无论如何,谢谢你,我也完全需要它!
ufloat x = -5;