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# 也提供了下列内置应用类型:

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

  • 相关阅读:
    DFGUI之Event Binding
    webform--常用的控件
    ASP.NET aspx页面中 写C#脚本; ASP.NET 指令(<%@%>);
    LinQ操作
    什么是C# Lambda表达式?形如:p=>p.abc
    winform基础
    winform之2---messagebox用法
    winform 之1---窗体介绍
    HTML-答案检查&按钮倒计时
    HTML-字体逐渐显示
  • 原文地址:https://www.cnblogs.com/gongchuangsu/p/4850198.html
Copyright © 2011-2022 走看看