值类型与引用类型(C#)

值类型

值类型主要由两类组成:

  • 结构
  • 枚举

结构分为以下几类:

  • Numeric(数值)类型
    • 整型
    • 浮点型
    • decimal
  • bool
  • 用户定义的结构

值类型表如下:
这里写图片描述

值类型的主要功能

  • 基于值类型的变量直接包含值。 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
  • 所有的值类型均隐式派生自 System.ValueType。
  • 与引用类型不同,不能从值类型派生出新的类型。 但与引用类型相同的是,结构也可以实现接口。
  • 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

初始化值类型

在使用 C# 中的局部变量之前,必须对其进行初始化。 例如,可能声明未进行初始化的局部变量,如以下示例所示:

int myInt;

那么在将其初始化之前,无法使用此变量。 可使用下列语句将其初始化:

myInt = new int();  // Invoke default constructor for int type.

此语句是下列语句的等效语句:

myInt = 0;    // Assign an initial value, 0 in this example.

当然,可以用同一个语句进行声明和初始化,如下面示例所示:

int myInt = new int();
//或
int myInt = 0;

使用 new 运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。 在上例中,默认构造函数将值 0 赋给了 myInt。
对于用户定义的类型,使用 new 来调用默认构造函数。 例如,下列语句调用了 Point 结构的默认构造函数:

Point p = new Point(); // Invoke default constructor for the struct.

此调用后,该结构被认为已被明确赋值;也就是说该结构的所有成员均已初始化为各自的默认值。

引用类型

一个引用类型的变量不存储它们所代表的实际数据,而是存储对实际数据的引用(一般而言,引用会是数据存储于存储器或存储设备中的物理地址。)。
引用类型分两步创建:首先在栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。
首先来看一例程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace example
{
    public class Car
    {
        public int carSpeed { get; set; }
        public string carName { get; set; }
        public Car( int carSpeed, string carName)
        {
            this.carSpeed = carSpeed;
            this.carName = carName;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Car a = new Car( 100, "BMW");
            Car b = new Car( 150, "Benz");

            // 测试值类型
            int carSpeed = a.carSpeed;
            a.carSpeed = 200;

            // 测试引用类型
            Car c = b;
            b.carName = "Ferrari";

            // 输出
            Console.WriteLine("carSpeed = {0}", carSpeed);
            Console.WriteLine("a.carSpeed = {0}", a.carSpeed);
            Console.WriteLine("b.carName = {0}", b.carName);
            Console.WriteLine("c.carName = {0}", c.carName);
            while(true);
        }
    }
}

输出结果:
这里写图片描述

由例程可知:int carSpeed = a.carSpeed ; a.carSpeed = 200,这条语句申请了一个 int 型的变量 carSpeed ,它在栈里另开辟一个地址,把值存在其中,当 a.carSpeed 的值改变时不会影响 carSpeed 的值。Car c = b; b.carName = “Ferrari”;,这里把 c 指向 b,也就是说两者在栈中存的是同一个引用,当 b.carName 改变时,c.carName 也会改变。

下面关键字用于声明引用类型:

  • class
  • interface
  • delegate

C# 也提供了下列内置应用类型:

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-08-28 14:54  贱贱的梦想  阅读(186)  评论(0编辑  收藏  举报