zoukankan      html  css  js  c++  java
  • 值类型与引用类型(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# 也提供了下列内置应用类型:

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

  • 相关阅读:
    在spring中该如何使用DTO,以及DTO和Entity的关系
    AngularJs踩过的坑
    springMVC正确使用GET POST PUT和DELETE方法,如何传递参数
    Mac下使用终端连接远程使用ssh协议的git服务器
    springMVC的异常处理
    根据业务规则分析业务对象,然后生成表结构
    在线资源--图片/json等
    js中的Hook
    diamond源码阅读-目录监控
    maven常用命令
  • 原文地址:https://www.cnblogs.com/gongchuangsu/p/4850198.html
Copyright © 2011-2022 走看看