C# 直接通过类名访问成员
我试图在c#中创建一个ufloat类/结构。这对我来说更具挑战性,但可以帮助我控制代码中的一些值。在尝试了几种方法后,我终于找到了一种似乎有效的方法: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 =
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;