代码改变世界

值类型,Nullable类型

2017-06-04 17:06  Dirichlet  阅读(411)  评论(0编辑  收藏  举报

 

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);
        }