首页 > 编程语言 >重温C#中的值类型和引用类型

重温C#中的值类型和引用类型

时间:2023-07-30 09:02:16浏览次数:58  
标签:Console C# double 重温 Location 类型 public 引用

在C#中,数据类型分为值类型引用类型两种。 引用类型变量存储的是数据的引用,数据存储在数据堆中,而值类型变量直接存储数据。对于引用类型,两个变量可以引用同一个对象。因此,对一个变量的操作可能会影响另一个变量引用的对象。对于值类型,每个变量都有自己的数据副本,并且对一个变量的操作不可能影响另一个变量。

值类型(Value Type)

所有的值类型都继承自ValueType类,它通过重载Object的虚方法来更好地适应值类型。

虽然ValueType是值类型的隐式基类,但不能直接创建继承自ValueType的类。 

值类型包含以下两种:

  •  结构类型(Structure Type),用于封装数据和相关的功能,包括自定义结构体和内置结构体(如:整型、浮点类型、布尔型、字符型和值元组)
  •  枚举类型(Enum Type),由一组命名常量定义,表示一个选项或选项组合。

结构类型直接继承自System.ValueType,  而枚举类型则是继承自System.Enum。

值类型是可以为空的,用System.Nullable<T> (或T?)泛型类型来表示,如:int?、bool?。因此,System.Nullable<T>本身也是一种值类型。

public struct Nullable<T> where T : struct

可以使用Struct约束来指定一个类型参数是不可空的值类型(结构类型和枚举类型都满足约束)。

值类型不能被继承,因为所有值类型最终会编译成终结类(sealed),但结构体可以实现接口。

下面是一个自定义的结构体:
public struct Location
{
    public double X;
    public double Y;
    public Location(double x, double y) => (X, Y) = (x, y);
}

 分别实例化具有相同数据的值对象a和b,进行相等判断,输出结果如下。由此可见:值类型相等比较的是数据本身。

var a = new Location(1,2);
var b = new Location(1,2);
var c = new Location(1,3);
Console.WriteLine(a.Equals(b)); // true
Console.WriteLine(b.Equals(c)); // false

引用类型(Reference Type)

最常见的引用类型就是类(class),  还包括字符串、数组、委托、接口、记录等。所有引用类型都继承自Object。

字符串(string):一种特殊的引用类型,它不能被继承,具有不可变性,但用法上更像是值类型。

string a = "123";
string b = a;
a = "456";
Console.WriteLine(a);  // "456"
Console.WriteLine(b);  // "123"

记录(record): C#9.0中引入,它不是一个新的语法,而是语法糖。用来定义一个引用类型,该类型提供内置封装数据功能。

public record Person(string FirstName, string LastName);
下面是一个自定义的类:
public class Location
{
    public double X;
    public double Y;
    public Location(double x, double y) => (X, Y) = (x, y);
}

同样分别实例化具有相同数据的引用对象a和b,进行相等判断,输出结果如下。由此可见:引用类型相等比较的是引用地址,而不是数据本身。

var a = new Location(1,2);
var b = new Location(1,2);
var c = b;
Console.WriteLine(a == b); // false
Console.WriteLine(a.Equals(b)); // false
Console.WriteLine(b == c); // true

值类型和引用类型比较

1. 值类型在结构中是堆栈分配或内联分配的,引用类型是堆分配的。

2. 值类型变量赋值复制的是对象本身,而引用类型变量赋值复制的是对象的引用。

3. 值类型和引用类型最终都是继承Object。

4. 值类型中的结构体和引用类型都可以实现接口。

5. 值类型不能被继承,因为所有值类型都是sealed,而引用类型可以派生新的类型(string除外)。

6. 值类型在内存管理方面具有更好的效率,适合用做存储数据的载体。引用类型支持多态,适合用于定义应用程序的行为。

 

参考资料:

Value types - C# reference | Microsoft Learn

Reference types - C# Reference | Microsoft Learn

标签:Console,C#,double,重温,Location,类型,public,引用
From: https://www.cnblogs.com/fengjq/p/17589245.html

相关文章

  • VS选择Visual C++中的控制台项目和空项目、Windows桌面应用程序三者之间有什么区别?
    在VisualStudio中创建C/C++项目时,可以选择控制台项目、空项目和Windows桌面应用程序,它们有以下区别:控制台项目(ConsoleApplication):这种项目类型适用于命令行应用程序的开发。它提供一个命令行界面,可以在控制台中进行输入和输出操作,通常用于简单的控制台程序,如计算器、文件......
  • error C1083: 无法打开包括文件:“iostream.h”: No such file or directory
    用VS2010打开VC++6程序,按下F5键会发现有错误提示:errorC1083:无法打开包括文件:“iostream.h”:Nosuchfileordirectory;而程序在VC++6中没有任何问题!主要的原因是:1.#include<iostream.h>是原来的C语言里面的,而#include<iostream>是c++的标准库里的,而要调用这个这个标准库......
  • 不启动SpringBootApplication 直接测试mybatis 下面xml中的sql
     测试类 privatestaticSqlSessionsqlSession=null;privatestaticRunoobTblMappermapper; @BeforeClasspublicstaticvoidsetUpMybatisDatabase()throwsIOException{InputStreamresourceAsStream=null;try{ClassLoaderclassLoader=R......
  • C#中跨线程更新UI简单方法
    .NET3.5中,C#winform无法直接在子线程中更新UI组件的属性,会报“更新UI的线程非UI组件的创建线程”的错误,需要用到委托更新。有两种方式:方式1:stringtest="测试...";this.BeginInvoke((Action)deleg......
  • ABC312
    T1:Chord模拟代码实现s=input()ifsin'ACE,BDF,CEG,DFA,EGB,FAC,GBD':print('Yes')else:print('No')T2:TaKCode模拟代码实现#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<(n);++i)using......
  • LeetCode做题笔记
    LeetCode做题笔记3.无重复字符的最长子串最核心的就是维护一个字符串区间,同时保证其中的每个字符都只出现过一次。最最最暴力的就是枚举可能出现的每个字符串区间,然后确保里边元素不重复,然后找出最长的字符串有多少元素。再进一步的想法就是由小到大的构建这样的字符串。用双指......
  • 三个编程思想:面向对象编程、面向接口编程、面向过程编程【概念解析系列_1】【C# 基础
    〇、前言对于.Net中的编程思想还是十分重要的,也是编码出高效的程序的基础!在使用之前了解其本质,那么用起来就游刃有余。下面来简单对比下三个编程思想,看下它们都是什么,它们之间又有什么关系。一、对象、接口、过程稍等,在介绍主角之前呐,先来了解下它们思想的基础是怎么回事。......
  • Pycharm中c、m、F、f、v、p分别代表的含义
    c代表Class:类m代表Method:类实例方法F代表Function:函数f代表Field:类属性,域v代表Variable:变量p代表Property:python内置函数p代表Parameter:参数<>代表Element:元素Directory:目录Package:包Python中函数(Function)和方法(Method)的区别:与类和实例无绑定关系的function都属于......
  • Anaconda超详细教程202378
    目录Anaconda超详细教程2023/7/8(windows)介绍Anaconda下载地址进入Anaconda官网。官网下载太慢了,推荐下载地址:**点击这里到清华镜像站下载安装详细步骤配置环境变量检查安装是否成功更改conda源(后续安装第三方库可以加快速度)Anaconda超详细教程2023/7/8(windows)介绍Anaconda......
  • C++运算符重载
    1.概念赋予运算符更多的功能。2.内容赋值运算符+-*/%运算符自增自减运算符输出流运算符的重载<<输入流运算符的重载>>函数调用运算符()下标运算符[]成员访问运算符->,*3.赋值运算符这个一般是用已存在的对象赋值给另一个已存在的对象。//如存在Comp......