我可以在 .NET 中使用 class 作为变量吗
Can I use a class as a variable in .NET
Public Class Temperature
Private dDegrees As Double
Private dFahrenheit As Double
Public Enum InputType
Degrees
Fahrenheit
End Enum
Sub New(ByVal dTemp As Double, eInputType As InputType)
Select Case eInputType
Case InputType.Degrees
dDegrees = dTemp
dFahrenheit = (1.8 * dTemp) + 32
Case InputType.Fahrenheit
dFahrenheit = dTemp
dDegrees = (5 / 9) * (dTemp - 32)
End Select
End Sub
' Properties and methods here
End Class
假设这是 class。
在主代码中我想做这样的事情。
Dim citytemp As New Temperature(35, Temperature.InputType.Degrees)
Dim value as double
'some code
value = citytemp - 18
我不想使用 citytemp.value 或 citytemp.degrees 之类的东西。我只想包括 citytemp 并且应该用度数的默认值代替它。
class可以这样构造吗?
我对 VC# 或 VB
都满意
Public Shared Operator -(t as Temperature, d as double) As Temperature
Return New Temperature(t.dDegrees - d)
End Operator
public static Temperature operator-(Temperature t, double d)
{
return new Temperature(t.dDegrees - d);
}
一些其他注意事项:
- 您可能还想实现加法运算符。
- 您可能想要实现其他接口,例如
IComparable
和 IEquatable
- 这将更好地实现为
Structure
(vb) 或 struct
(c#)
- 应该只有一个字段。选择该字段代表的单位,然后只存储一个。另一个字段应该是一个 属性,只有一个
get
,它应用计算。
- 请注意,这些运算符的数学运算始终采用特定单位(在本例中为摄氏度)。
- 这种类型的对象通常称为 value object。
另请注意,在您的问题中,您将结果分配给了 double
,但我举了一个将其作为 Temperature
返回的示例,我认为这更有意义。如果您还希望它可以分配给 double
,您可以添加一个隐式转换操作,正如 Leandro 在他的回答中所建议的那样。
在 C# 中,您可以使用隐式和显式转换运算符。在这里查找:http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
我不知道 VB 是怎么回事(或者如果可能的话),也不知道语法。
但是,在您的这种特殊情况下,我会避免为温度实现此功能 class:它只会给设计带来混乱,并使代码更难维护。我认为使用如下语法会更清楚:
value = citytemp.ToCelsius() - 18;
您已经得到了一些答案,但下面是我如何在 C# 中实现您的示例 class(使用 3 个私有变量)...我编写了一个简单的控制台应用程序作为 testharness/example 告诉你如何使用它。
由于 Double/Integer 转换,您的转换代码中存在一个(潜在的)错误,我也已为您修复此问题。
class Program
{
static void Main(string[] args)
{
Temperature temp = 100;
temp.setTempType(Temperature.InputType.Fahrenheit);
Double theTempinFarenheit = temp.Fahrenheit();
temp.setTempType(Temperature.InputType.Degrees);
Double theTempinCelcius = temp.Celcius();
Double theTempAsJustAValue = (Double)temp;
}
}
[System.Diagnostics.DebuggerDisplay("{dDegrees}")]
public class Temperature
{
private double dDegrees;
private double dCelcius;
private double dFahrenheit;
public enum InputType {
Degrees,
Fahrenheit
}
public Temperature (Double dTemp)
{
dDegrees = dTemp;
}
public Temperature (Double dTemp, InputType eInputType)
{
switch (eInputType)
{
case InputType.Degrees:
dDegrees = dTemp;
dCelcius = dTemp;
dFahrenheit = (1.8 * dTemp) + 32;
break;
case InputType.Fahrenheit:
dCelcius = dTemp;
dFahrenheit = dTemp;
dDegrees = (5.00 / 9.00) * (dTemp - 32);
break;
default:
break;
}
}
public Double setTempType(InputType eInputType)
{
switch (eInputType)
{
case InputType.Degrees:
dCelcius = dDegrees;
dFahrenheit = (1.8 * dDegrees) + 32;
return dDegrees;
case InputType.Fahrenheit:
dFahrenheit = dDegrees;
dCelcius = (5.00 / 9.00) * (dDegrees - 32);
return dFahrenheit;
default:
return dDegrees;
}
}
public static implicit operator Temperature(Double dTemp)
{
return new Temperature(dTemp);
}
public static explicit operator Double(Temperature temp)
{
return temp.dDegrees;
}
public Double Fahrenheit()
{
return dFahrenheit;
}
public Double Celcius()
{
return dCelcius;
}
public override string ToString()
{
return dDegrees.ToString();
}
}
Public Class Temperature
Private dDegrees As Double
Private dFahrenheit As Double
Public Enum InputType
Degrees
Fahrenheit
End Enum
Sub New(ByVal dTemp As Double, eInputType As InputType)
Select Case eInputType
Case InputType.Degrees
dDegrees = dTemp
dFahrenheit = (1.8 * dTemp) + 32
Case InputType.Fahrenheit
dFahrenheit = dTemp
dDegrees = (5 / 9) * (dTemp - 32)
End Select
End Sub
' Properties and methods here
End Class
假设这是 class。
在主代码中我想做这样的事情。
Dim citytemp As New Temperature(35, Temperature.InputType.Degrees)
Dim value as double
'some code
value = citytemp - 18
我不想使用 citytemp.value 或 citytemp.degrees 之类的东西。我只想包括 citytemp 并且应该用度数的默认值代替它。
class可以这样构造吗?
我对 VC# 或 VB
都满意Public Shared Operator -(t as Temperature, d as double) As Temperature
Return New Temperature(t.dDegrees - d)
End Operator
public static Temperature operator-(Temperature t, double d)
{
return new Temperature(t.dDegrees - d);
}
一些其他注意事项:
- 您可能还想实现加法运算符。
- 您可能想要实现其他接口,例如
IComparable
和IEquatable
- 这将更好地实现为
Structure
(vb) 或struct
(c#) - 应该只有一个字段。选择该字段代表的单位,然后只存储一个。另一个字段应该是一个 属性,只有一个
get
,它应用计算。 - 请注意,这些运算符的数学运算始终采用特定单位(在本例中为摄氏度)。
- 这种类型的对象通常称为 value object。
另请注意,在您的问题中,您将结果分配给了 double
,但我举了一个将其作为 Temperature
返回的示例,我认为这更有意义。如果您还希望它可以分配给 double
,您可以添加一个隐式转换操作,正如 Leandro 在他的回答中所建议的那样。
在 C# 中,您可以使用隐式和显式转换运算符。在这里查找:http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
我不知道 VB 是怎么回事(或者如果可能的话),也不知道语法。
但是,在您的这种特殊情况下,我会避免为温度实现此功能 class:它只会给设计带来混乱,并使代码更难维护。我认为使用如下语法会更清楚:
value = citytemp.ToCelsius() - 18;
您已经得到了一些答案,但下面是我如何在 C# 中实现您的示例 class(使用 3 个私有变量)...我编写了一个简单的控制台应用程序作为 testharness/example 告诉你如何使用它。
由于 Double/Integer 转换,您的转换代码中存在一个(潜在的)错误,我也已为您修复此问题。
class Program
{
static void Main(string[] args)
{
Temperature temp = 100;
temp.setTempType(Temperature.InputType.Fahrenheit);
Double theTempinFarenheit = temp.Fahrenheit();
temp.setTempType(Temperature.InputType.Degrees);
Double theTempinCelcius = temp.Celcius();
Double theTempAsJustAValue = (Double)temp;
}
}
[System.Diagnostics.DebuggerDisplay("{dDegrees}")]
public class Temperature
{
private double dDegrees;
private double dCelcius;
private double dFahrenheit;
public enum InputType {
Degrees,
Fahrenheit
}
public Temperature (Double dTemp)
{
dDegrees = dTemp;
}
public Temperature (Double dTemp, InputType eInputType)
{
switch (eInputType)
{
case InputType.Degrees:
dDegrees = dTemp;
dCelcius = dTemp;
dFahrenheit = (1.8 * dTemp) + 32;
break;
case InputType.Fahrenheit:
dCelcius = dTemp;
dFahrenheit = dTemp;
dDegrees = (5.00 / 9.00) * (dTemp - 32);
break;
default:
break;
}
}
public Double setTempType(InputType eInputType)
{
switch (eInputType)
{
case InputType.Degrees:
dCelcius = dDegrees;
dFahrenheit = (1.8 * dDegrees) + 32;
return dDegrees;
case InputType.Fahrenheit:
dFahrenheit = dDegrees;
dCelcius = (5.00 / 9.00) * (dDegrees - 32);
return dFahrenheit;
default:
return dDegrees;
}
}
public static implicit operator Temperature(Double dTemp)
{
return new Temperature(dTemp);
}
public static explicit operator Double(Temperature temp)
{
return temp.dDegrees;
}
public Double Fahrenheit()
{
return dFahrenheit;
}
public Double Celcius()
{
return dCelcius;
}
public override string ToString()
{
return dDegrees.ToString();
}
}