ValueType 类
为值类型提供基类。
继承Object------->ValueType
其中枚举基类Enum就继承于ValueType
注解
ValueType 重写中的虚方法 Object ,并为值类型提供更合适的实现。
C#只有两种数据类型:值类型 和 引用类型。
命名空间namespace下 5个关键字:
关键字 enum,struct 表示值类型
关键字 class,delegate,interface表示引用类型
数据类型被分隔为值类型和引用类型。 值类型要么是堆栈分配,要么在结构中以内联方式分配。 引用类型为堆分配。
引用类型和值类型均派生自最终基类 Object 。 如果需要值类型的行为与对象类似,则会在堆上分配值类型类似于引用对象的包装,并将值类型的值复制到其中。
包装已标记,因此系统知道它包含值类型。 此过程称为装箱,相反的过程称为取消装箱。 装箱和取消装箱允许任何类型被视为对象。
尽管 ValueType 是值类型的隐式基类,但无法创建直接从继承的类 ValueType 。 相反,单个编译器提供语言关键字或构造 (如 struct
c # 和 Structure
.。。End Structure
在 Visual Basic) 支持创建值类型。
除了充当 .NET Framework 中的值类型的基类, ValueType 结构通常不在代码中直接使用。 但是,它可用作方法调用中的参数,以将可能的自变量限制为值类型而不是所有对象,或者允许方法处理许多不同的值类型。
新建.Net Core 控制台应用程序:
using System;
using System.Numerics;
//新建.net core 控制台应用程序
namespace ValueTypeCoreDemo
{
class Program
{
/// <summary>
/// 两数比较的结果枚举
/// </summary>
enum CompareResult
{
/// <summary>
/// 不能比较
/// </summary>
CannotCompare = -100,
/// <summary>
/// 大于
/// </summary>
GreaterThan = 1,
/// <summary>
/// 等于
/// </summary>
EqualTo = 0,
/// <summary>
/// 小于
/// </summary>
LessThan = -1
}
static void Main(string[] args)
{
Console.WriteLine(IsNumeric(12.345));
Console.WriteLine(IsNumeric('A'));
Console.WriteLine(IsNumeric(true));
Console.WriteLine(IsNumeric(DayOfWeek.Sunday));
Console.WriteLine(IsNumeric(DateTime.Now));
Console.WriteLine(IsInteger(12345));
Console.WriteLine(IsInteger(1.234E+6));
Console.WriteLine(IsDecimal(234));
Console.WriteLine(IsDecimal(7.987E-2));
Console.WriteLine($"【{134567}】 {Compare(134567, 1.35E+5M)} 【{1.35E+5M}】");
Console.ReadLine();
}
/// <summary>
/// 两数比较
/// </summary>
/// <param name="firstVal"></param>
/// <param name="secondVal"></param>
/// <returns></returns>
static CompareResult Compare(ValueType firstVal, ValueType secondVal)
{
if (!IsNumeric(firstVal))
{
Console.WriteLine($"第一个数【{firstVal}】不是数字,无法比较");
return CompareResult.CannotCompare;
}
if (!IsNumeric(secondVal))
{
Console.WriteLine($"第二个数【{secondVal}】不是数字,无法比较");
return CompareResult.CannotCompare;
}
if (IsInteger(firstVal) && IsInteger(secondVal))
{
//整数比较
return (CompareResult)BigInteger.Compare((BigInteger)firstVal, (BigInteger)secondVal);
}
else
{
//小数比较
try
{
decimal num1 = Convert.ToDecimal(firstVal);
decimal num2 = Convert.ToDecimal(secondVal);
return (CompareResult)num1.CompareTo(num2);
}
catch (Exception ex)
{
Console.WriteLine("转化为小数失败:" + ex.Message);
return CompareResult.CannotCompare;
}
}
}
/// <summary>
/// 是否整数
/// </summary>
/// <param name="valueType"></param>
/// <returns></returns>
static bool IsInteger(ValueType valueType)
{
return valueType is SByte || valueType is Byte || valueType is Int16 || valueType is UInt16
|| valueType is Int32 || valueType is UInt32 || valueType is Int64 || valueType is UInt64
|| valueType is BigInteger;
}
/// <summary>
/// 是否小数
/// </summary>
/// <param name="valueType"></param>
/// <returns></returns>
static bool IsDecimal(ValueType valueType)
{
return valueType is Single || valueType is Double || valueType is Decimal;
}
/// <summary>
/// 是否是数字:【整数 或者 小数】
/// </summary>
/// <param name="valueType"></param>
/// <returns></returns>
static bool IsNumeric(ValueType valueType)
{
return IsInteger(valueType) || IsDecimal(valueType);
}
}
}
运行效果