当前位置: 首页 > 编程语言 > C#

使用真实世界的单位代替类型分享

时间:2023-04-10 15:55:45 C#

使用真实世界的单位代替类型我有一个涉及很多真实世界单位的计算项目:该项目涉及复杂而众多的计算公式。这就是为什么我认为使用温度、距离等自定义类型可以提高代码的可读性。例如:温度x=-55.3;米y=3;或varx=newTemperature(-55.3);我正在尝试创建一个使用双内部值的温度类。公共类温度{double_Value=double.NaN;publicTemperature(){}publicTemperature(doublev){_Value=v;}publicstaticimplicitoperatorTemperature(doublev){returnnewTemperature(v);}}但是class可以是空的。这意味着:温度myTemp;是“正确的”并且将为空。我不想要这个。我不想使用结构,因为它们太有限了:我想知道是否有办法告诉C#:TemperaturemyTemp=23K;//C#没有实现任何东西来制作K单元...但我知道C#不处理任何自定义单元。温度myTemp=newKelvin(23);//这可能行得通所以我想我可以创建两个继承温度的Celsius和Kelvin类,然后我开始怀疑这个想法是否真的值得,因为它涉及大量编码和测试。这是我想开始的讨论:在我的代码中使用真实世界的单位而不是.NET类型是一件好事吗?这个人已经拥有了吗?陷阱和最佳实践是什么?或者我应该远离这个并使用标准的.NET类型更好吗?实现此目的的一种方法是结合使用原始对象(在您的情况下为TemperatureTraits)和专门用于原始对象的TemperatureTraits类。与C++类似,String等价类basic_string其实是一个类模板(C#术语中的generics),它不仅有模板参数,还有字符串元素(char,widechar),还有一个带有traits的类,详细说明类的行为方式对于给定类型的字符串元素(例如char_traits)。在您的情况下,您可以定义一个泛型公共类,例如MeasurableWithUnits,然后实现不仅取决于可测量类,还取决于单元类。这在实践中有多大用处取决于这样的对象有多少是真正通用的——哪些操作在Measurable和Units的组合中是通用的?如果这种方法看起来很有趣,请参阅此处有关C#功能的研究论文。为什么不试试这样的结构://////使用摄氏基本单位的温度类///publicstructTemp{publicstaticTempFromCelsius(doublevalue){returnnewTemp(value);}publicstaticTempFromFahrenheit(doublevalue){returnnewTemp((value-32)*5/9);}publicstaticTempFromKelvin(doublevalue){returnnewTemp(value-273.15);}publicstaticTempoperator+(Templeft,Tempright){returnTemp.FromCelsius(left.Celsius+right.Celsius);}私有双值;私人温度(双值){_value=value;}publicdoubleKelvin{get{return_value+273.15;}}publicdoubleCelsius{get{return_value;}}publicdoubleFahrenheit{get{return_value/5*9+32;}}}然后使用它,比如:staticvoidMain(string[]args){varc=Temp.FromCelsius(30);varf=Temp.FromFahrenheit(20);vark=Temp.FromKelvin(20);总变量=c+f+k;Console.WriteLine("总温度为{0}F",total.Fahrenheit);我想当你想为温度添加更具体的功能时可能会很好(示例:IsFreezing())要解决开尔文和摄氏度问题:创建一个接口ITemperature和一个基类。在基类中,您可以实现接口并为所有类填写相同的详细信息。如果你使用structsstructTemperature{double_Value;你不能为空我认为不值得向C#中的单元添加静态类型。您需要重载这么多运算符(对于所有单元组合,而不仅仅是所有单元)。并构建诸如Math.Sqrt、普通双打等函数……您可能会尝试使用动态类型:classPhysicalUnit{}structPhysicalValue{readonlyValue;只读物理单元;然后在调试模式下编译时,添加一个检查单位是否合适。在发布中,只需删除PhysicalUnit字段和所有检查,您(几乎)与使用普通双打的代码一样快。我将使Temperature成为一个抽象类,它将温度(以开尔文为单位)存储在InternalTemperature属性中。派生类Celcius将在内部将输入值转换为Kelvin。它将有一个(只读)Value属性,可以将内部值转换回来。比较它们(比一个温暖)很容易。以上就是C#学习教程的全部内容:用真实世界的单位代替类型。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: