首页 > 编程语言 >c#笔记(3)

c#笔记(3)

时间:2025-01-07 21:57:44浏览次数:3  
标签:10 Console c# void 笔记 int WriteLine 类型

栈和堆

运行中的程序用两个内存区域来储存数据,栈和堆

栈(Stack):快速、小型,用于存储短生命周期的简单数据(如值类型和引用的指针)。

栈是一个内存数值讲究后进先出的数据结构储存几种类型的数据

1.某些类型变量的值

2.程序当前的执行环境

void Example1()
{
    int x = 1; // 局部变量 x 存储在栈中
    Example2(x); // 方法调用时,将 x 的值(1)传递并压入栈中 
}

void Example2(int y)
{
    int z = y + 5; // 局部变量 y 和 z 存储在栈中
}
z=1+5=6

3.传递给方法的参数

void AddNumbers(int a, int b)
{
    int result = a + b; // 参数 a 和 b,以及局部变量 result 都存储在栈中
}

void Example1()
{
    AddNumbers(5, 10); // 调用方法时,5 和 10被压入栈中作为参数
}
 

栈只能从顶部插入和删除,入栈(push)和出栈(pop)

类似叠木块,叠好后从最上面的开始拿走

堆(Heap):灵活、大型,用于存储更复杂、长生命周期的数据(如对象和引用类型)。

堆可以分配大块的内存储存对象,堆能任意存入和移除内存,当不再访问某数据时,

自动垃圾收集器会自动清理

决定储存方式栈或堆

预定义类型sbyte, short, int, long, byte, ushort, uint, ulong,boolfloat, double, char, decimal, object, string, dynamic
用户定义类型struct, enumclass, interface, delegate, Array

值类型只需要一段单独的内存,用于储存实际数据,值类型数据储存在栈里

1.值类型:

int a = 10; // 栈中存储了变量 a,值为 10
int b = a;  // 栈中分配了另一个独立的变量 b,值也为 10
b = 20;
Console.WriteLine(a); // 输出:10(a 和 b 互不影响)
 

引用类型需要两段内存     

2. 引用类型: 

MyClass obj1 = new MyClass {  }        

引用类型的对象的数据部分始终存放在堆里  new堆内存堆(Heap)中分配一块空间   

第一段储存实际数据,引用类数据总是位于堆中   

第二段是一个引用,从栈中指向数据在堆中的位置 ,引用(变量)放在栈中

自动初始化

变量类型      存储位置      自动化

局部变量        栈或堆          否          用于函数局部计算

类字段            堆                 是          类的成员

结构字段        栈或堆          是          结构的成员

参数                栈                否          用于值传入传出的方法 

数组元素         堆                是          数组的成员

1.局部变量

void Example()
{
    int a; // 局部变量未初始化
    Console.WriteLine(a); // 编译错误:使用了未赋值的局部变量
}
 

2.类字段

class MyClass
{
    public int Number; // 自动初始化为 0
    public string Text; // 自动初始化为 null
}

void Example()
{
    MyClass obj = new MyClass();
    Console.WriteLine(obj.Number); // 输出:0
    Console.WriteLine(obj.Text);   // 输出:null
}

值类型:如 int 默认值为 0boolfalse

引用类型:如 string 默认值为 null

3.结构字段

结构体的字段会根据结构体的存储位置(栈或堆)被自动初始化。

struct MyStruct
{
    public int Number; // 自动初始化为 0
}

void Example()
{
    MyStruct myStruct = new MyStruct(); // 实例化结构
    Console.WriteLine(myStruct.Number); // 输出:0
}

4.参数

void MyMethod(int value)
{
    Console.WriteLine(value); // 必须有一个明确的初始值
}

MyMethod(10); // 调用时传入值

当// MyMethod(10); // 编译器报错:没有提供参数


5.数值元素

正常赋值 :

int[] numbers = new int[3]; // 创建数组,默认值为 [0, 0, 0]
numbers[0] = 10; // 显式赋值
numbers[1] = 20;
numbers[2] = 30;
Console.WriteLine(string.Join(", ", numbers)); // 输出:10, 20, 30


初始化:

int[] numbers = new int[3]; // 创建一个长度为 3 的数组
Console.WriteLine(numbers[0]); // 输出:0(自动初始化)
 

标签:10,Console,c#,void,笔记,int,WriteLine,类型
From: https://blog.csdn.net/m0_57200015/article/details/144973800

相关文章

  • Vuex mapMutations和mapActions
    一、mapMutations1、作用:帮助我们生成与mutations对话的方法,即包含$store.commit()2、步骤a、引入import{mapActions,mapMutations}from'vuex'b、语法methods:{//mapMutations生成addNumsubisNum对象方法...mapMutations({addNum:"ADD",subisNum:"SU......
  • nuxt3 useFetch useAsyncData $fetch 区别
    1.useFetchuseFetch是一个用于获取数据的高层次工具,结合了useAsyncData和$fetch的功能,特别适用于需要与Nuxt3的服务器端渲染(SSR)集成的情况。特点:自动处理状态:useFetch会自动处理加载状态、错误状态以及数据缓存。SSR支持:它默认支持SSR,并会在服务器端预取数据。返......
  • C++STL<unordered_map>
    在C++中,<unordered_map>是一种基于哈希表的关联容器,它存储键值对,并且不保证元素的排序。以下是unordered_map的一些常用函数及其使用方式:插入元素:insert(constvalue_type&val)或insert(initializer_listinit)用于插入元素。std::unordered_map<int,std::string......
  • C++头文件map
    在C++中,<map>头文件提供了一种关联容器,它存储的是键值对(std::pair),并且会自动根据键进行排序。以下是一些常用的map函数及其使用方式:插入元素:insert(constvalue_type&val)或insert(initializer_listinit)用于插入元素。std::map<int,std::string>myMap;myMap.......
  • Ultra-Low Precision 4-bit Training of Deep Neural Networks
    目录概主要内容Radix-4FP4formatGradScaleTwo-PhaseRounding(TPR)SunX.,WangN.,ChenC.,NiJ.,AgrawalA.,CuiX.,VenkataramaniS.andMaghraouiK.E.andSrinivasanV.Ultra-lowprecision4-bittrainingofdeepneuralnetworks.NeurIPS,2020.概本文......
  • Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
    文章目录模式介绍优缺点适用场景结构案例实现注意事项模式介绍有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。拿订餐来说......
  • IPSEC实验汇总
    IPSEC实验汇总1.IKE主模式及预共享秘钥认证配置举例1.1配置参考如下:设备组网:A---B设备A设备B sysnameA sysnameB##interfaceLoopBack0interfaceLoopBack0 ipaddress2.1.1.1255.255.255.255 ipaddress3.1.1.1255.255.255.255##inte......
  • Docker:安装 XXL-JOB 分布式调度任务的技术指南
    1、简述XXL-JOB是一个分布式任务调度平台,提供简单易用的任务调度功能。它支持分布式调度、失败重试、任务监控和报警等功能。XXL-JOB采用了服务端与执行器的架构,任务调度在服务端进行,而任务的实际执行则由各个执行器完成。XXL-JOB的核心功能包括:支持分布式任务调度和......
  • 了解RabbitMQ中的Exchange:深入解析与实践应用
            在分布式系统设计中,消息队列(MessageQueue)扮演着至关重要的角色,而RabbitMQ作为开源消息代理软件的佼佼者,以其高性能、高可用性和丰富的功能特性,成为了众多开发者的首选。在RabbitMQ的核心组件中,Exchange(交换机)是一个不可或缺的部分,它负责接收生产者发送的消息,......
  • 有奖活动:pick 你最爱的 AI 项目!拿社区年度大奖!
      ......