zoukankan      html  css  js  c++  java
  • 值类型,Nullable类型

     

    1. 值类型

    比如说int吧,是值类型,是个struct,是这样声明的

    public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32>


    哪能看出来继承自ValueType?? 再说struct不是不能继承吗?为什么说继承自ValueType??

    直接打印int的基类确实显示基类是ValueType.

    Console.WriteLine(typeof(int));
    Console.WriteLine(typeof(int).BaseType);
    Console.WriteLine(typeof(int).BaseType.BaseType);
    
    /*输出:
    System.Int32
    System.ValueType
    System.Object
    */

    回答: ValueType的确是class,但是他的子类却是值类型,这是因为CLR对他的子类经过了特殊的处理.CLR若判断某类继承自ValueType,那么会在内存分配方面使它具有值类型的特征(例如直接分配在栈上),这和类库的继承层次结构并无多大关系。

    public abstract class ValueType

    C#这边的编译器也经过了特殊处理,使值类型在诸多方面不同于类类型,例如,我们不可以声明一个继承自ValueType的值类型等等. 简单的说微软对.net中的值类型做了特殊处理使其继承自ValueType.注:语法上struct是不允许继承的,但可以实现接口.觉得微软挺恶心的.老搞一些和语法不符的东西.

    public struct Int32可以认为是public class Int32 : ValueType的另外一种写法。

     

    2. Nullable类型

    public struct Nullable<T> where T : struct

    只支持值类型,表示可以为null的值类型变量。可以使用 ?放在值类型之后。 例如,在 C# 或 Integer? 的 int?

    对应于数据库表中可以为NULL的字段.

    static void Main(string[] args)
            {
                int? a;
                int? b;
    
                // Test null
                a = null;
                Console.WriteLine(a.HasValue);
                Console.WriteLine();
    
                // 
                a = 2;
                b = a;
                Console.WriteLine("a.HasValue = {0}, b.HasValue = {1}", a.HasValue, b.HasValue);
                Console.WriteLine("a = {0}", a.Value);
                Console.WriteLine("b = {0}", b.Value);
                Console.WriteLine();
    
                b = 3;
                Console.WriteLine("b = {0}", b.Value);
            }
  • 相关阅读:
    图解HTTP学习笔记——简单的HTTP协议
    Java编程思想学习笔记——类型信息
    Java编程思想学习笔记——字符串
    Java编程思想学习笔记——接口
    Java编程思想学习笔记——复用类
    Java编程思想学习笔记——类的访问权限
    ESLint
    关于常见继承的几种方法
    flux,redux,vuex状态集管理工具之间的区别
    商品放大镜效果
  • 原文地址:https://www.cnblogs.com/dirichlet/p/3264439.html
Copyright © 2011-2022 走看看