刘铁猛C#教程笔记——详解类型,变量和对象第二节

news2024/12/26 0:16:02

C#类型派生谱系

  •  C#语言五大基本类型:

    1.类类型:由class关键字声明的类型,常见的类类型有:string,object

    2.结构体类型:由struct关键字声明的类型,常见的结构体类型有:int,uint,long,ulong,bool,short,ushort,char等等

    3.枚举类型:由enum关键字声明的类型

    4.委托类型:由dalegate关键字声明的类型

    5接口类型:由interface关键字声明的类型


    再进一步归类,类,委托,接口属于引用类型,结构体,枚举属于值类型,而所有类型的终极基类都是object类

  •  变量:初识变量时,其仅仅就是数据的容器,用于存放数据的,但是其实变量代表了内存中的某一块空间,变量是指从变量名所代表的内存地址开始,以数据类型所要求的数据长度为大小的一块内存空间;而这块内存空间要么用于存放值,要么用于存放一个地址,若这块内存空间用于存放的是值,那么该变量就是值类型的变量,若此块内存空间用于存放的是一个内存地址,那么该变量就是一个引用类型的变量;

    变量的分类:局部变量,静态变量,实例变量,数组元素变量,值类型参数变量,引用类型参数变量,输出参数变量                                                                                                                局部变量:定义在函数中的变量                                                                                                  静态变量:即静态子段,在定义在类中,以static关键字进行修饰的变量,静态变量是属于类的,而不是属于某一个具体的类实例                                                                                        实例变量:定义在类中,无static关键字修饰的变量,其属于实例,而不属于类                      数组元素变量:即数组元素                                                                                                         值类型参数变量:是函数的形式参数,无任何修饰符修饰的形式参数                                        应用类型参数变量:以关键字ref进行修饰的函数的形式参数变量                                              输出类型参数变量:以关键字out进行修饰的函数的形式参数变量                                                                                    

  • 值类型:值类型的变量与引用类型的变量的区别是,值类型的变量所对应的内存空间里面存放的是值类型变量的值;以int类型为例,讲解值类型变量在内存空间中是如何存放的

    上一篇博文中我们提到过,程序要运行的话,必须从磁盘上读取到内存中,才可以运行,而内存被分为了三大部分:操作系统占用的内存空间,栈空间,堆空间,操作系统占用的内存空间不可被访问,程序读取到内存中时占用的是栈空间和堆空间;内存按字节编址,其为每一个字节空间都指定了一个独立的编号,也就是编址,当我们想要访问某一块内存空间中的值时,需要先拿到该内存空间的地址,这就是寻址过程,以下用excel表格来模拟内存空间:

    那么细心的人也许会想:程序的不同组成部分到底具体存放在堆空间中呢,还是存放在栈空间中,上一篇博文中我们提到,程序中出现的方法在运行时存放在栈空间中,相应的在方法中定义的局部变量,函数参数等都会存放在栈空间中,而对象也就是实例是存放在堆空间中的,以如下程序讲解值类型变量在内存空间中是如何存放的:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace course
    {
        class Program
        {
            static void Main(string[] args)
            {
                int a = 100;
            }
        }
    }
    

    在上面的代码中我定义了一个值类型的变量a,并为其赋值100,因为a定义在Main函数中,所以其属于局部变量,那么,当程序运行时a会被存放在内存中的栈空间上,当程序读入内存中时,内存会先看变量定义,发现该变量是局部变量,且a是int类型的,那么系统就会在内存的栈空间中找到连续的4个字节的空闲栈空间

    如图,假设103~106是空闲的,那么系统就将该块内存空间分给变量a,然后在该块内存空间中存放变量a的实际值,当然要将实际值转换成二进制数在放入内存中,所以内存中该块区域存放的实际值为: 

     

    int类型占4个字节,即32bit,将100转换成二进制时不足32位的高位补0补足32位,注意内存中存放数据值时,遵循高位存放在高地址,地位存放在低地址的原则;                                    以如下程序讲解引用类型的变量在内存空间中是怎样存放的:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace course
    {
        class Program
        {
            static void Main(string[] args)
            {
                Example e;
                e = new Example();  
            }
            
        }
        class Example
        {
            int a;
            char b;
        }   
    }
    

     在上面的程序中我定义了一个叫做Example的类,类中定义了两个实例变量,分别为int型和char型,int型占4个字节,char型占用2个字节;在Main方法中我声明了一个局部变量e,当程序读入内存时,系统会在栈空间找一个空闲的内存块分配给变量e,而变量e是引用类型的变量,系统会为引用类型的变量分配固定的4字节的内存空间,

    假设110~113栈空间是空闲的,那么此时变量e得到的内存空间就是紫色区域,在该空间中存放的是什么呢?前面我们提到引用类型变量存放的是一个地址,存放的是什么地址呢,接着往下看,e = new Example();  该程序语句为Example类创建了一个实例或者说是对象,而实例是存放在堆内存空间中的,所以此时系统去堆空间中找一块空闲的内存块分配给该实例,而该实例应该占据6个字节,假设305~310是空闲的,系统将其分配给该实例, 

    前四个字节存放int型的实例属性a,后两个字节存放char型的实例属性b ,所以引用类型的变量e所代表的内存空间中存放的地址就是实例对象在堆空间中的首地址305,当然需要将305转换成二进制再存放到e所指向的空间中;

    由于我没有给实例属性赋值,所以系统自动为其赋值为0;而实例属性类型都是值类型,所以相应的实例变量所对应的内存空间中存放的内容都是实例的值;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 基本语法

尤雨溪 文章目录 前言MVVM框架认识Vue文本渲染指令 v-text属性绑定指令title 属性动态绑定class属性动态绑定style 属性动态绑定 事件绑定 事件名条件渲染指令v-ifv-if 和 v-showv-else 和 v-else-if 循环遍历指令 前言 提示:这里可以添加本文要记录的大概内容&am…

Documentation 代码注释文档规范

1. 代码注释文档规范的添加 /// 代码规范文档 struct DocumentationBootcamp: View {// MARK: PROPERTIESState var data:[String] ["Apples", "Oranges", "Bananas"]State var showAlert: Bool false// MARK: BODY// Code Folding : 代码折叠…

Spring Boot原理分析(二):IoC

文章目录 〇、IoC思想和IoC容器IoC体现了什么思想什么是IoC容器 一、Spring IoC容器的继承层次1.BeanFactory2.ListableBeanFactory3.HierarchicalBeanFactory4.ApplicationContext5.常用的ApplicationContext的实现类ClassPathXmlApplicationContext(基于XML配置&a…

FreeRTOS详细目录结构和作用

FreeRTOS各个目录的功能简介 1. Demo目录:这个目录下主要包含了大量官方支持的微控制器和不同平台上的项目,包括常用的stm32和keil平台下进行开发的项目。我主要使用的是CORTEX_STM32F103_Keil和common两个目录,对系统进行精简的话可以只保留…

光伏行业中的设备自动化系统EAP:优化生产流程的重要工具

随着清洁能源的需求不断增长,光伏行业作为可再生能源的重要组成部分,正迅速发展。为了满足日益增长的市场需求,光伏企业需要提高生产效率、降低成本,并保证产品的质量和可靠性。 图.光伏面板(pexels) 在这…

校园跑腿小程序怎么做

校园跑腿小程序是为了方便学生在校园内解决各类需求而设计的一款应用程序。该小程序具有多种功能,包括校园跑腿、二手市场、骑手接单、校园表白墙、下单支付、学校代理以及佣金抽成等。 1. 校园跑腿: 该小程序提供校园内的跑腿服务,学生可以…

【开源项目】中后台开发框架vue-admin-work-pro

vue-admin-work-pro 基本介绍 基于Vue3、Vite、TypeScript、NaiveUI、Vuex等最新技术栈开发的开箱即用的中后台前端框架。 内置常用模板,无需考虑交互排版,助你高效开发样式美观大方,无缝对接 Naive Ui,随意组合页面&#xff0c…

ME GO小车

ME GO小车 ⚫ 体积小巧 ⚫ 集成多种传感器和执行器 ⚫ Mixly图形化编程 避障检测、自动巡线、灯光显示、 声音报警、自动测距、物联遥控等 ME GO小车——俯视图 ME GO小车——车底 ME GO CE 以上选自芯”向未来 元控智联挑战赛(小学组)赛事介绍资料二…

操作系统Linux—day03

操作命令 搜索文件 find命令 1按照文件名称搜索 语法:find [路径] -name “文件名 ” -print 打印出所有查找文件名的路径 2按照更新时间搜索 语法: find [路径] -mtime 3 -print 查找更改时间为3天前的文件,3表示3天前,-3…

python 第三方包安装

1 MAC 打开终端 ,证明安装上python了 2 直接输入 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark 其中 python3. 多的版本 需要 pip3 也可以直接用 pip 试一试 -i https://pypi.tuna.tsinghua.edu.cn/simple : 为 国内镜像地址 pyspark 第三方包

苹果pencil和普通的有什么区别?ipad第三方电容笔推荐

苹果原装电容笔和那种只具备倾斜压感的平替电容笔不一样,平替电容笔并没有具备重力压感。但是,如果你并不经常需要绘画的话,那么你也不必花费太多的金钱来购买一支价格如此贵的苹果电容笔,选择一款平替电容笔即可。在这里&#xf…

c++11 标准模板(STL)(std::basic_istream)(六)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式…

阿里云容蓓:DCDN 助力云原生时代的应用构建及最佳实践

在数字化转型速度不断提升的今天&#xff0c;大带宽、低时延、高并发的场景不断涌现&#xff0c;内容分发网络(Content Delivery Network&#xff0c;CDN)应用需求还在不断攀升&#xff0c;打造更高质量的CDN服务将成为新时代产业竞争的关键所在。亚太CDN峰会自2012年第一届以来…

python_day7_画图

json数据与python字典的相互转换 import json列表&#xff0c;其中每个元素均为一个字典 data [{"name": "张三", "age": 10},{"name": "李四", "age": 13},{"name": "jay", "age&qu…

【论文阅读】Scaling Laws for Neural Language Models

前言 本文简要介绍 Scaling law 的主要结论原文地址&#xff1a;Scaling Laws for Neural Language Models个人认为不需要特别关注公式内各种符号的具体数值&#xff0c;而更应该关注不同因素之间的关系&#xff0c;比例等 Summary Performance depends strongly on scale, w…

windows安装netcat

netcat 就是 nc netcat官网&#xff1a;https://eternallybored.org/misc/netcat/ 将下载的netcat解压到C:\Program Files重命名为netcat &#xff08;安装位置自定义&#xff09; 配置一下环境变量&#xff0c;让nc命令可以在任何地方使用 在系统变量中加入netcat的启动路径 …

【面试题37】优化MYSQL数据库的方法有哪些

文章目录 一、前言二、优化的方向2.1 数据库设计优化2.2 查询优化2.3 硬件优化2.4 配置优化2.5. 定期维护和监控 三、MySQL查询优化的一些方向3.1 使用索引3.2 优化查询语句3.3 避免使用SELECT *3.4 分析查询计划3.5 设置合适的缓存大小3.6 分区表3.7 使用连接池3.8 定期优化数…

记录一组excel函数-将同一个id的多组数据整合到一格并用逗号隔开

初始数据如上图&#xff0c;用函数整理成下图 主要涉及两点&#xff1a;去重和集合 1.去重&#xff1a; 方法1: UNIQUE函数 使用方法&#xff1a;输入函数UNIQUE&#xff08;范围1:范围2&#xff09; 方法2:数据->删除重复项 使用方法&#xff1a;选中需要删除重复项的列&a…

Android :Activity生命周期

MainActivity .java import android.app.Activity; import android.os.Bundle; import android.util.Log; import java.util.function.LongToDoubleFunction; public class MainActivity extends Activity { //日志标记 private String TAG this.getClass().getSimpleNa…

Jenkins持续集成:使用Gerrit Trigger插件实现代码提交自动验证

Gerrit Trigger插件集成了Gerrit代码审查&#xff0c;当创建一个“patch set”时触发Jenkins构建&#xff0c;本文档介绍Gerrit Trigger插件配置及使用方法。 目录 安装Gerrit Trigger插件Gerrit 访问权限配置Jenkins Gerrit Server配置Gerrit Trigger配置 安装Gerrit Trigger插…