我正在上课,帮助我在单位之间进行转换,我需要询问创建这项工作的最佳方法。
这是关于温度的示例代码:
public class Temperature
{
private double _Celsius = 0;
public double Celsius
{
get { return _Celsius; }
set
{
_Fahrenheit = (value * 9 / 5) + 32;
_Kelvin = value + 273.15;
}
}
private double _Fahrenheit = 0;
public double Fahrenheit
{
get { return _Fahrenheit; }
set
{
_Celsius = (value - 32) * 5/9;
_Kelvin = _Celsius + 273.15;
}
}
private double _Kelvin = 0;
public double Kelvin
{
get { return _Kelvin; }
set
{
_Celsius = value - 273.15;
_Fahrenheit = (_Celsius * 9 / 5) + 32;
}
}
}
我希望知道这个班级是否还有其他好的一个?
答案 0 :(得分:3)
为什么只有一个(例如_Celsius
)足够三个字段_Fahrenheit
,_Kelvin
,_Celsius
:
public class Temperature {
private double _Celsius
public double Celsius {
get {
return _Celsius;
}
set {
// Simplest: no validation (e.g. -500 degree is an evident error)
_Celsius = value;
}
}
public double Kelvin {
get {
return Celsius + 273.15;
}
set {
Celsius = value - 273.15;
}
}
public double Fahrenheit {
get {
return Celsius * 9 / 5 + 32;
}
set {
Celsius = (value - 32) * 5 / 9;
}
}
}
现在让我们考虑一下使用常规的预期方法是什么?例如。我想将100
Fahrenheit 转换为 Kelvin :
double result = new Temperature() { Fahrenheit = 100.0 }.Kelvin;
有点罗嗦和反直觉,对吗?可能是一个更好的选择是实现一堆static method
s?并且根本不创建任何课程?
public static class Temperatures {
public static double FahrenheitToCelsius(double value) {...}
public static double CelsiusToKelvin(double value) {...}
public static double FahrenheitToKelvin(double value) {
return CelsiusToKelvin(FahrenheitToCelsius(value));
}
...
}
...
double result = Temperatures.FahrenheitToKelvin(100.0);
答案 1 :(得分:3)
温度基本上是一种复杂的数字。"它可以用不同的测量单位来衡量,但最终你仍然应该能够比较两个不同的温度,以确定它们是否相等,或者一个是否超过"另一个。您可能还想添加两个温度或减去它们。
我看到这个类的行为类似于.NET提供的TimeSpan类。你的温度等级'实施将选择一个单独的计量单位私人使用 - 让凯尔文说。温度然后提供方便"属性,以任何您想要的测量单位(华氏度或摄氏度)提供温度:
public class Temperature
{
private double _kelvin = 0.0;
public double Kelvin
{
get { return _kelvin; }
set { _kelvin = value; }
}
public double Fahrenheit
{
get { return /* convert Kelvin to Fahrenheit */; }
set { _kelvin = /* convert Fahrenheit to Kelvin */; }
}
public double Celsius
{
get { return /* convert Kelvin to Celsius */; }
set { _kelvin = /* convert Celsius to Kelvin */; }
}
}
此外 - 与TimeSpan类一样 - 您将需要静态方法,使您可以使用任何"基础测量"快速轻松地创建温度实例。你当时喜欢的单位:
/* Also inside the Temperature class: */
public static Temperature FromKelvin(double kelvin)
{
var temperature = new Temperature();
temperature.Kelvin = kelvin;
return temperature;
}
public static Temperature FromFahrenheit(double fahrenheit)
{
var temperature = new Temperature();
temperature.Fahrenheit = fahrenheit;
return temperature;
}
public static Temperature FromCelsius(double celsius)
{
var temperature = new Temperature();
temperature.Celsius = celsius;
return temperature;
}
使用这种方法,您可以使用一些很好的干净用法语法;
var myTemperatureInKelvin = Temperature.FromCelsius(100.0).Kelvin;
最后 - 要从这样的类中获得一些真正的 - 你需要implement comparison and arithmetic operators获得相等,大于和小于比较,加法,减法等。这使您可以非常干净地比较或添加多个温度;
var resultInFahrenheit = (Temperature.FromCelsius(100.0) + Temperature.FromKelvin(200.0)).Fahrenheit;
疯狂!而且很有用!
答案 2 :(得分:0)
我猜你可能不想加载温度对象,你只想将一个数字转换为另一个数字。所以我会考虑将温度设为静态类,即
public static Temperature
所以你可以写一个类似
的方法public static double GetKelvinFromCelsius(double celsius) {
return (celsius + 273.15);
}
可以使用:
double kelvinTemperature = Temperature.GetKelvinFromCelsius(400);