C#ValueType值类型

82 篇文章 3 订阅

ValueType 类

为值类型提供基类。

继承Object------->ValueType

【参考微软官方文档】

其中枚举基类Enum就继承于ValueType

注解

ValueType 重写中的虚方法 Object ,并为值类型提供更合适的实现。

C#只有两种数据类型:值类型 和 引用类型。

命名空间namespace下 5个关键字:

关键字 enum,struct 表示值类型

关键字 class,delegate,interface表示引用类型

数据类型被分隔为值类型和引用类型。 值类型要么是堆栈分配,要么在结构中以内联方式分配。 引用类型为堆分配。 

引用类型和值类型均派生自最终基类 Object 。 如果需要值类型的行为与对象类似,则会在堆上分配值类型类似于引用对象的包装,并将值类型的值复制到其中。 

包装已标记,因此系统知道它包含值类型。 此过程称为装箱,相反的过程称为取消装箱。 装箱和取消装箱允许任何类型被视为对象。

尽管 ValueType 是值类型的隐式基类,但无法创建直接从继承的类 ValueType 。 相反,单个编译器提供语言关键字或构造 (如 structc # 和 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);
        }
    }
}
 

运行效果

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值