.NET(C#) 基础类型

news/发布时间2024/8/25 18:53:50

 参考文档:.Net(C#)基础类型-CJavaPy

在.NET框架中,C# 提供了一系列的基础类型(也称为原始类型或内置类型),这些类型是构建更复杂数据结构和执行操作的基础。这些基础类型主要可以分为两大类:值类型和引用类型。值类型和引用类型的主要区别在于它们的存储位置和如何处理数据的复制。理解这些类型对于管理内存和提高应用程序性能非常重要。C# 的类型系统非常灵活,允许开发者根据需要选择合适的数据类型。

1、值类型 和 引用类型

值类型是一种重要的数据类型,它的核心特点是直接存储其值,而非指向数据的引用。值类型通常在栈上分配,也就使用它们的访问速度快,但相对来说存储空间较小。值类型包括基本数据类型如整数(intshortlong 等),浮点数(floatdouble),布尔值(bool),字符(char),以及用户自定义的结构(struct)和枚举(enum)。

当值类型的变量被传递给方法或赋值给另一个变量时,实际上传递或赋值的是数据的副本,而非引用。这意味着原始数据和副本是完全独立的,对一个变量的修改不会影响另一个。所有值类型都有默认值,例如 int 的默认值是 0,且它们不能是 null(除非是可空类型,如 int?)。

值类型的这些特性使得它们在需要快速访问和频繁创建/销毁数据的场景中表现出色,尤其适合用于表示简单的数值和状态。然而,对于更大或更复杂的数据结构,引用类型可能是更合适的选择,特别是考虑到值类型在传递大型结构时可能会影响性能。因此,在 C# 编程中,正确选择使用值类型或引用类型对于保证程序的效率和可靠性至关重要。

引用类型是一类核心的数据类型,它们通过存储数据的内存地址来引用数据,而不是直接包含数据本身。这些类型的对象存储在托管堆上,这不仅带来了更大的内存开销,但也提供了更高的数据管理灵活性。引用类型的变量可以被赋值为 null,也就是它们可以不指向任何实际的数据。

引用类型的典型例子包括类(class),字符串(string),数组(如 int[]),接口(interface),以及委托(delegate)。当这些类型的数据被传递到方法中或赋值给其他变量时,实际上传递的是对数据的引用,因此多个变量可以指向堆上的同一个数据块,从而实现数据的共享和高效管理。

引用类型尤其适用于构建复杂的数据结构(如链表和树)和实现动态行为,因为它们可以在运行时动态创建和修改。然而,这也带来了一些挑战,比如更高的内存开销和潜在的内存泄漏问题。我们需要谨慎处理可能出现的空引用异常(NullReferenceException)并理解 .NET 垃圾回收机制的工作原理,以确保内存的有效管理和应用程序的性能优化。

使用示例如下,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{//引用类型class RefData{public Int32 a;}//值类型struct ValData{public Int32 a;}class Program{static void Main(string[] args){RefData r1 = new RefData(); //在堆上分配ValData v1 = new ValData(); //在栈上分配r1.a = 5; //在托管堆上修改v1.a = 5; //在栈上修改Console.WriteLine(r1.a); //显示“5”Console.WriteLine(v1.a); //也显示“5”RefData r2 = r1; //只复制引用(指针)ValData v2 = v1; //在栈上分配并复制成员r1.a = 8; //r1.a和r2.a都会更改v1.a = 9; //v1.a会更改,但v2.a不变Console.WriteLine(r1.a); //显示“8”Console.WriteLine(r2.a); //显示“8”Console.WriteLine(v1.a); //显示“9”Console.WriteLine(v2.a); //显示“5”}}
}

2、值类型和引用类型的使用优化

1)值类型的优化

值类型直接存储数据,通常位于栈上,这使得它们在访问速度上比引用类型更快。但是,不当使用可能会导致性能问题。避免不必要的装箱和拆箱,装箱(Boxing)发生在将值类型转换为引用类型(如 object 或 interface)时,拆箱(Unboxing)则是相反的过程。这两个过程都需要额外的性能开销。尽量避免不必要的装箱和拆箱操作。使用结构体(struct)时要小心,结构体是值类型。在传递大的结构体时,应考虑使用引用传递(例如使用 ref 或 in 关键字)以避免复制整个结构体。考虑使用 readonly struct,对于不会被修改的结构体,使用 readonly struct 可以减少拷贝时的开销,并提高代码的可读性。选择合适大小的数据类型,使用适合数据范围的最小数据类型。例如,如果数据范围允许,使用 int 而不是 long

2)引用类型的优化

引用类型存储数据的引用,而数据本身存储在堆上。引用类型适合表示较大的或复杂的数据结构。谨慎管理堆内存,堆上的数据分配和回收比栈上的操作更复杂,过度使用或不当管理堆内存可能会导致内存泄漏和性能下降。使用对象池,对于频繁创建和销毁的对象,考虑使用对象池来重用对象,这可以减少垃圾回收(GC)的负担。优化大型对象的使用,大型对象(例如大数组)会直接在大对象堆(LOH)上分配,这可能影响性能。在使用大型对象时要特别小心,尽量重用它们。避免过多的小对象分配,创建大量的小对象会增加垃圾回收器的工作量。如果可能,尝试合并小对象或使用值类型替代。

3、初学者常见误区

在学习.NET框架中的C#编程时,初学者常常会遇到关于值类型(Value Types)和引用类型(Reference Types)的一些误解。理解这些概念对于写出高效和健壮的代码至关重要。

有一个常见的误解是关于值类型和引用类型的存储位置。许多人认为值类型总是存储在栈上,而引用类型总是在堆上。实际上,值类型存储在它们被声明的上下文中,例如,类的成员(值类型)存储在堆上作为对象的一部分。而引用类型的对象总是在堆上,但引用本身(即地址)可以存储在栈上或堆上。装箱和拆箱也是常见的误解点。装箱是将值类型转换为引用类型(如 object)的过程,而拆箱是将引用类型转换回值类型的过程。这些操作只在值类型和引用类型之间的转换时发生,而不是在所有类型转换中都发生。

结构体(struct)的使用也经常被误解。虽然结构体可以提高效率,因为它们通常不涉及堆分配或垃圾回收,但如果结构体很大,频繁地将其作为值传递可能会导致性能问题。此外,字符串的不可变性也是一个需要注意的点。在C#中,字符串是不可变的,一旦创建了一个字符串,就无法更改其内容。任何看似修改字符串的操作实际上都是创建了一个新的字符串。

关于值类型和引用类型的默认值也是一个常见误区。未初始化的值类型变量具有其类型的默认值(例如,int 的默认值是 0),而未初始化的引用类型变量的默认值是 null。选择使用值类型还是引用类型应根据具体情况。例如,对于小型、不可变的数据结构,值类型可能更合适;而对于需要共享或动态更改的大型数据结构,引用类型可能更适合。

参考文档:.Net(C#)基础类型-CJavaPy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.liansuoyi.cn/news/60385402.html

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

tensorflow-GPU环境搭建

KnockHarder的主页 最近在学习AI相关知识,需要使用 gpu 运行 tensorflow 代码,选择在腾讯云上搭建环境 要点总结 1 版本号对齐 安装 tensorflow 与 GPU 支持需要对齐以下软件的版本号(按依赖顺序排列):GPU 驱动版本号CUDA 版本号cudnn 版本号tensorflow 版本号由于 tensor…

一次菠菜网站的渗透测试

从某个大哥手里拿到一个菠菜得day,是一个任意文件上传得0day,通过任意文件上传获取到webshell,但是扫描端口能看到开启了宝塔。然后就出现了下面的问题。使用哥斯拉的bypass插件可以执行命令。用户为WWW,宝塔的默认用户,接下来就是常规操作,提权、SSH登陆拿宝塔。先进行提…

15.宠物商店 接口自动化测试实战

目录被测产品 需求说明 相关知识点 接口自动化测试实战被测产品PetStore 宠物商城:一个在线的小型的商城。 主要提供了增删查改等操作接口。 结合 Swagger 实现了接口的管理。需求说明完成宠物商城宠物管理功能接口自动化测试。编写自动化测试脚本。 完成复杂断言。相关知识点…

【MarkDown语法】

@目录前言一、样式1.标题3. 字体4. 引用5. 分割线6.图片7. 超链接8. 列表9. 表格10. 代码总结前言 提示:这里可以添加本文要记录的大概内容: 推荐文本编辑器:Typora 文件后缀.md提示:以下是本篇文章正文内容,下面案例可供参考 一、样式 1.标题 markdown语法中共有六级标题…

Flume安装配置

简介 Apache Flume 是一个分布式、可靠、高可用的服务,用于有效地收集、聚合和移动大规模数据。Flume 主要用于大数据环境下的日志收集和数据传输,能够帮助用户实现数据流的可靠传输和集中处理。 flume安装配置 解压安装包 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt/…

MyBatis学习记录之MyBatis概述

MyBatis学习记录之MyBatis概述前言 这篇文章是我第二次学习b站老杜的MyBatis相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正; 关于本笔记,只是我对于相关知识遗忘时快速查…

【OpenFeign】【NamedContextFactory】深入剖析 NamedContextFactory 的原理以及使用

1 前言 这几天看 OpenFeign 的源码,发现一个类 NamedContextFactory(带命名的上下文容器工厂),简单的说就是根据 name 隔离出来不同的 Context ,单看这个的话这个类还是比较重的哈,你比如说我有 10个名字,100个名字,那它岂不是要创建 10个上下文,100个上下文呀,是的…

读AI3.0笔记01_引言

读AI3.0笔记01_引言1. GEB 1.1. Godel, Escher, Bach-- An Eternal Golden Braid, 简称GEB 1.1.1. 《哥德尔、艾舍尔、巴赫——集异璧之大成》 1.1.2. 《GEB:一条永恒的金带》 1.2. 一本关于计算机最终将如何获得智能和自我意识的著作 1.2.1. 获得了普利策奖和美国国家图书奖 …

【算法】【线性表】【链表】环形链表 II

1 题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引…

V8 入门记录二:环境与调试

环境搭建 这里先说下我的环境, 这是代码运行的前提。系统: Mac Monterey 12.6.8 Xcode: 14.2 Python: 3.11.6 (不要使用 2.x 版本!)建议全程指令都在FQ工具下进行由源码构建 V8首先我们需要一个工具 depot_tools执行指令克隆,这里我是在文件夹 /Users/apple/Sites/demo/d…

智谱DevDay 嘉宾演讲的一点点思考

(1)AI的落地方向:【超级个体】+【智能流程】 【超级个体】就是说,让员工把AI在工作中用起来。不仅仅是提高效率,先让一个人尝到甜头,它才有可能研究这东西。你说服不了一个人研究AI,但你可以让它看看AI的威力。 但这只是一个一个单点,我们还需要把点连线,让整个流程自…

Python进阶

Python一切皆对象 对象介绍Python的对象是一种数据抽象或者数据结构抽象,对象应该同时具备:本征值(Indentity)、型式(Type)、值(Value)三个参数。 a = 45 print(id(a)) # 表示在python中的唯一内存地址,具备唯一性 print(type(a)) print(a)/*-----output-------*/ 206…

week 4 周二

2024/1/16 周二 今日工作: B站黑马程序员JavaWeb课程学习:https://www.bilibili.com/video/BV1Qf4y1T7Hx?p=31&spm_id_from=pageDriver&vd_source=2eacb4ea8d30c233944de286c081d965 学习笔记:

iis 软件启动后,状态栏有图标,但是窗口没法显示在桌面

找到IIS管理器启动程序的所在位置并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性,找到其位置 管理员模式打开cmd命令行,并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因:由于某种原因,之前该窗口的位置被改动过…

VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR

目录简介模型核心代码性能实验 简介 描述了一个变分自编码器的端到端图像压缩模型。这个模型结合了超先验来捕获潜在表示的空间依赖性,这种超先验涉及到了边信息。并且该模型与底层的自编码器结合一起进行端到端优化。 模型 熵编码依赖于编码器和解码器共享的量化表示的先验概…

设计之道:图片素材选择与创意运用

在现代设计领域,图片素材的选择与运用至关重要。一张优质的图片素材可以为设计增色添彩,提升作品的品质和视觉效果。那么,如何挑选合适的图片素材,并将其巧妙地融入设计中呢?本文将为您一一解答。 免版素材库 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://a…

关于命令行修改K8s内Prometheus配置文件参数

#登录master节点操作 1、进入prometheus介质目录: [root@k8s-master01]$ cd /yang/operator/operator-0.7/manifests/prometheus 2、备份prometheus配置文件 [root@k8s-master01]$cp prometheus-prometheus.yaml prometheus-prometheus.yaml.20231215 3、编辑prometheus配置文…

Jmeter对数据库做压力测试,完整过程

Jmeter对数据库做压力测试 一、环境:apache-jmeter-5.0,Oracle11g、windows7、jdk1.8、ojdbc14-10.2.0.2.0.jar 二、操作配置: 2.1、启动Jmeter Jmeter初始化界面.png 2.2、界面切换到中文界面 切换语言.png 中文界面.png 2.3、在项目上添加一个线程组 线程组.png 2.4、…

深入了解 ReadDirectoryChangesW 并应用其监控文件目录

ReadDirectoryChangesW 是Windows提供一个函数,它属于Windows API的一部分,主要用于监视文件系统中目录的修改、新增、删除等变化,并通过回调函数向应用程序提供通知。该API很实用,目前市面上已知的所有运行在用户态同步应用,都绕不开这个接口。但正确使用该API相对来说比…
推荐文章