C#编程-描述内存分配

描述内存分配

分配给变量的内存通过两种方式引用:值类型和引用类型。内置数据类型,诸如int、char和float都是值雷兴国。当您声明int变量时,编译器会分配一个内存块以保持该整数值。请思考以下语句:

csharp 复制代码
	int Num = 50;

上述语句为保存值50的Num1变量分配内存。

引用类型(如类)由编译器以不同的方式处理。当您声明一个类变量时,编译器不会分配内存块以保持某个类。而是分配一块内存,该内存能够存储对另一个包含该类的内存块的引用。当new关键字用来创建对象时,会为类对象分配。

值类型包含数据,而引用类型包含对存储数据的位置的引用。因此,值类型称作直接类型,而引用类型称作间接类型。下图显示了值类型变量和引用类型变量。

在上图中,名为Num1的值类型变量具有值5.名为Car的引用类型变量具有到存储值Rolls Royce Phantom的内存位置的值。

要了解值类型引用,请考虑这样一个示例,您将变量Num1声明为int,并且赋予值50。如果您将另一个变量Num2声明为int,并将Num1,Num2将包含于Num1一样的值。但是,两个变量包含值50的不同副本。如果您修改Num1中的值,则Num2中的值不会更改。

以下代码段是值类型变量的示例:

csharp 复制代码
	int Num1 = 50;  //declare and initialize Num1
	int Num2 = Num1;  //Num2 contains the copy of the data in Num1
	Num1++;  //incrementing Num1 will have no effect on Num2

下图显示了如何在上例中讲内存分配到值类型变量。

注释

所有值类型都是在栈上创建的。栈存储器的组织类似于堆在书架上的书。

要了解引用类型,请思考类Car。如果Car类的BWM对象用同一个类中的另一个对象Ford初始化,那么Ford和BWM都将引用相同的位置。

以下代码是引用类型变量的示例:

csharp 复制代码
	using System;
	namespace Ref_Type
	{
		class class1
		{
			static void Main(string[] args)
			{
				Car Ford = new Car();
				Ford.Model = 10();
				Car BMW = Ford;
				BMW.Display_Model();
				Ford.Display_Model();
			}
		}
		class Car
		{
			public int Model;
			public void Display_Model()
			{
				Console.WriteLine(Model);
			}
		}
	}

注释

所有的引用类型都是在堆上创建的。堆存储器类似于在一行中一本本排列的书。

除了内置数据类型(例如:int和float),还有其他的值类型(例如:结构和枚举),它们是用户定义道德数据类型。类似地,还有各种引用类型,例如,数组和集合。

小问题:

所有引用类型均在______上创建。

答案:Heap

相关推荐
Leinwin12 小时前
Copilot Studio 实战:多模型选择、GitHub Copilot harness 计费与 Copilot Credits 额度管理
开发语言·c#
FuckPatience12 小时前
C# Winform 使用Label循环显示闪烁
开发语言·c#
念何架构之路13 小时前
OpenTelemetry核心概念
后端·目标跟踪·golang·c#·linq
开开心心就好13 小时前
电脑语音实时转文字工具,会议记录很省事
运维·服务器·前端·c#·ocr·perl·1024程序员节
波力海苔夹心脆67513 小时前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
何以解忧唯有撸码20 小时前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
阿松爱学习1 天前
【Unity开发】局部区域截图功能实现
unity·c#
zhanghaha13141 天前
C# 系列教程_1 基础语法篇(面向新手系统教程)
开发语言·c#
昂好的day1 天前
固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解
开发语言·c#
淡海水1 天前
08-02-优化-LINQ与函数式编程的GC代价
unity·c#·.netcore·linq·gc