02值类型

分配在栈上、派生于System.ValueType的值类型:
● 简单类型,比如int,uint,byte,sbyte,short,long,ulong,char,float,double,decmial,bool都属于值类型。简单类型对应BCL基类库的别名,比如byte对应System.Byte,short对应System.Int16等。
● 结构和枚举属于值类型。

 

什么是BCL基类库:
Base Class Library基类库,即mscorlib.dll这个程序集中包含类库。不管项目的"引用"文件夹里是否引用,默认是引用进来的。C#中的关键字,比如int, string都会被映射到BCL基类库中的对应类型。BCL也为中间语言CIL提供基础支持。

 

栈(Stack)和堆(Heap):
栈和堆

 

  在对变量操作前是不会入栈的

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat;
        }
    }

    public struct MyCuteCat
    {
        public int _age;

        public MyCuteCat(int age)
        {
            this._age = age;
        }
    }
}

1

 

  一旦对变量操作,就会有出栈和入栈操作

展开     class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat;
            cat._age = 1;
            Console.WriteLine(cat._age);
            Console.ReadKey();
        }
    }

2  

 

  引用类型初始化需要new对象,否则报错

把结构类型改成class,生成的时候会出现编译错误。

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat;
            cat._age = 1;
            Console.WriteLine(cat._age);
            Console.ReadKey();
        }
    }

    public class MyCuteCat
    {
        public int _age;
        public MyCuteCat(int age)
        {
            this._age = age;
        }
    }
}

3

 

  所有的元素在使用前必须初始化,否则报错

把cat._age = 1;注释掉。

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat;
            //cat._age = 1;
            Console.WriteLine(cat._age);
            Console.ReadKey();
        }
    }

    public struct MyCuteCat
    {
        public int _age;
        public MyCuteCat(int age)
        {
            this._age = age;
        }
    }
}

4

 

  对结构而言,在调用方法之前需要对所有字段进行赋值

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat;
            //cat._age = 1;
            //Console.WriteLine(cat._age);
            cat.SayHi();
            Console.ReadKey();
        }
    }

    public struct MyCuteCat
    {
        public int _age;
        public MyCuteCat(int age)
        {
            this._age = age;
        }

        public void SayHi()
        {
            Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
        }
    }
}

5

去掉cat._age = 1;的注释,运行。

6

如果要对结构的每个字段赋值会很麻烦。

 

  结构类型的构造函数

□ 使用结构的构造函数对结构字段进行初始化

 

是由编译器隐式为结构类型创建的。在构造函数中对结构类型进行初始化,值类型的初始值是0,引用类型的初始值是null。

注意:不可以对结构类型显式地声明构造函数。

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat = new MyCuteCat();
            //cat._age = 1;
            //Console.WriteLine(cat._age);
            cat.SayHi();
            Console.ReadKey();
        }
    }

    public struct MyCuteCat
    {
        public int _age;
        public MyCuteCat(int age)
        {
            this._age = age;
        }

        public void SayHi()
        {
            Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
        }
    }
}

运行结果:
7

 

IL部分:
8

 

可见:
MyCuteCat cat意味着在线程栈上创建了一个类型为MyCuteCat的变量cat,并入栈。
new MyCuteCat()并不是创建实例,也不不会分配内存,仅仅是调用结构的构造函数对字段进行初始化。

 

□ 如果没有声明局部变量,会创建一个临时变量

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(new MyCuteCat()._age);
            Console.ReadKey();
        }
    }

    public struct MyCuteCat
    {
        public int _age;
        public MyCuteCat(int age)
        {
            this._age = age;
        }

        public void SayHi()
        {
            Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
        }
    }
}

9

 

□ 通过结构的构造函数为结构字段赋初值

展开using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCuteCat cat = new MyCuteCat(10);
            cat.SayHi();
            Console.ReadKey();
        }
    }

    public struct MyCuteCat
    {
        public int _age;
        public MyCuteCat(int age)
        {
            this._age = age;
        }

        public void SayHi()
        {
            Console.WriteLine("我是猫小姐,我今年" + _age + "岁了");
        }
    }
}

10

 

IL部分:
11

 

※参考资料
《.NET之美》--张子阳,感谢写了这么好的书!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值