C#图解教程第三章

  • 3.1 C#程序是一组类型声明
  • 3.2 类型是一种模板
  • 3.3 实例化类型
  • 3.4 数据成员和函数成员
  • 3.5预定义类型
  • 3.6用户定义类型
  • 3.7 栈和堆
    • 3.7.1 栈
    • 3.7.2 堆
  • 3.8 值类型和引用类型
    • 3.8.1 存储引用类型对象的成员
    • 3.8.2 C#类型的分类
  • 3.9 变量
    • 3.9.1 变量声明
    • 3.9.2 多重变量声明
    • 3.9.3 使用变量的值
  • 3.10 静态类型和dynamic关键字
  • 3.11 可空类型

3.1 C#程序是一组类型声明

C程序是一组函数和数据类型,C++程序是一组函数和类,C#程序是一组类型声明。

命名空间是一种把相关的类型声明分组并命名的方法

namespace MyProgram       // 创建新的命名空间
{DeclarationOfTypeA   //声明类型DeclarationOfTypeB   //声明类型Class C              //声明类型{static void Main(){....}}
}

3.2 类型是一种模板

类型想象成一个用来创建数据结构的模板,模板本身并不是数据结构,但它详细说明了由该模板构造的对象的特征。

类型由下面的元素定义:

  • 名称

  • 用于保存数据成员的数据结构

  • 一些行为及约束条件

3.3 实例化类型

从某个类型模板创建实际的对象,称为实例化该类型

  • 通过实例化类型而创建的对象被称为类型的对象或类型的实例对象实例这两个术语可以互换

  • 在C#程序中,每个数据项都是某种类型的实例,这些类型可以是语言自带的,可以是BCL或其他库提供的,也可以是程序员定义的

3.4 数据成员和函数成员

简单类型:只能存储一个数据项,比如short、int、long等

数组元素:可以存储多个数据项。比如数组,其数据项称为元素,元素可以通过索引查找

成员:可以包含许多不同类型的数据项,这些类型中的数据项个体称为成员。对于这些成员,大致分两种。如下

数据成员:保存了与这个类的对象或作为一个整体的类相关的数据

函数成员:执行代码。函数成员定义类型的行为

类型XYZ举例说明,包含两个数据成员和两个函数成员

3.5预定义类型

C#提供16中预定义类型。所有预定义类型的名称都由小写字母组成

  • Char。一种Unicode字符类型
  • Object。所有其他类型的基类
  • dynamic。使用动态语言编写的程序集时使用
  • decimal。小数类型的有效数字精度为28位。

3.6用户定义类型

除了C#提供的15中预定义类型,用户还可以自己创建用户定义类型,有6中类型可以由用户自己创建。包括:类类型、结构类型、数组类型、枚举类型、委托类型、接口类型

类型通过类型声明创建,类型声明包含:

  • 要创建的类型的种类
  • 新类型的名称
  • 对类型中每个成员的声明(名称和规格)。array和delegate类型除外,它们不含有命名成员

一旦声明了类型,就可以创建和使用这种类型的对象。使用预定义类型是一个单步过程,简单地实例化对象。使用用户定义类型是一个两步过程,必须先声明类型,然后实例化该类型的对象。

3.7 栈和堆

程序运行时,数据必须存储在内存中,数据项需要注意需要多大的内存、存储在什么地方、如何存储依赖于数据项的类型。运行中的程序使用两个内存区域来存储数据:栈和堆

3.7.1 栈

系统接管所有的栈操作。

栈是一个内存数组,是LIFO(后进先出)的数据结构。栈存储几种类型的数据:

  • 某些类型变量的值
  • 程序当前的执行环境
  • 传递给方法的参数

栈的特征

  • 数据只能从栈的顶端插入和删除
  • 把数据放到栈顶称为入栈(push)
  • 从栈顶删除数据称为出栈(pop)

3.7.2 堆

堆是一块内存区域,区别于栈是一个内存数组。在堆里可以分配大块的内存用于存储某类型的数据对象。与栈不同,堆里的内存能够以任意顺序存入和移除

虽然程序可以在堆里保存数据,但并不能显式地删除它们,CLR的自动GC(垃圾收集器)在判断出程序的代码将不会再访问某数据项时,自动清除无主的堆对象。

3.8 值类型和引用类型

数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置—栈和堆

类型分两种:值类型和引用类型。这两种类型的对象在内存中的存储方式不同

值类型只需要一段单独的内存,用于存储实际的数据。比如int、float等

引用类型需要两段内存。

  • 第一段存储实际的数据,它总是位于堆中
  • 第二段是一个引用,指向数据在堆中的存放位置

对于值类型,数据存放在栈中,对于引用类型,实际数据存放在堆里而引用存放在栈里

3.8.1 存储引用类型对象的成员

引用类型对象的数据部分始终存放在堆里。

值类型对象或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,这依赖于实际环境

假如有一个引用类型的实例,名称为MyType,有两个成员:一个值类型成员和一个引用类型成员。这两个成员都会被存放在堆里,无论它们是值类型还是引用类型。

对于一个引用类型,其实例的数据部分始终存放在堆里。

3.8.2 C#类型的分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQp6PABI-1667618442485)(C:\Users\buluw\AppData\Roaming\Typora\typora-user-images\image-20221105101416326.png)]

3.9 变量

一种多用途的编程语言必须允许程序存储数据,可通过变量实现。

变量是一个名称,表示程序执行时存储在内存中的数据

C#提供了4中变量

3.9.1 变量声明

变量使用前必须声明。

变量声明定义了变量,并完成两件事:1.给变量命名,并为它关联一种类型。2让编译器为它分配一块内存。

一个简单的变量声明至少需要一个类型和一个名称


变量初始化语句除了声明变量的名称和类型以外,还能把它的内存初始化为一个明确的值。

变量初始化语句由一个等号后面跟一个初始值组成

无初始化语句的本地变量有一个未定义的值,在未赋值之前不能使用,否则编译器会报错

一些类型的变量如果在声明时没有初始化语句,就会自动设为默认值,没有自动初始化为默认值的变量在程序为它赋值之前包含未定义值

3.9.2 多重变量声明

可以把多个变量声明在一条单独的声明语句中。

  • 多重变量声明中的变量必须类型相同

  • 变量名称必须用逗号分隔,可以在变量名后包含初始化语句

  • 只要使用逗号分开,初始化的变量可以和未初始化的变量混子一起

3.9.3 使用变量的值

变量名代表该变量保存的值,可以通过使用变量名来使用值

//var2的值被从内存获取并放在变量名的位置
Console.WriteLine("{0}",var2);

3.10 静态类型和dynamic关键字

每一个变量都包括变量类型,所以编译器可以确定运行时需要的内存总量以及哪些部分应该存在栈上,哪些部分应该存在堆上。

静态类型:变量的类型在编译的时候确定并且不能在运行时修改,

动态类型:变量的类型直到运行时才会被解析

程序集中的类型到运行时才会被解析。但C#又要引用这样的类型并且需要在编译的时候解析类型。dynamic关键字代表一个特定的、实际的C#类型,是动态化的静态类型。知道如何在运行时解析自身。

这样就满足了两种限制,C#编译器可以把关键字解析为实际类型,并且类型对象又可以在运行时把自身解析成目标程序集的类型

3.11 可空类型

在某些情况下,特别是使用数据库时,需要表示变量目前未保存有效的值,对于引用类型,可以把变量设置为null。对于值类型变量,由于其内容是否有有效的意义,其内存都会进行分配。

这里引出可空类型。可空类型允许创建可以标记为有效或无效的值类型,即可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。可空类型的使用就可以在使用它之前确定值的有效性。普通的值类型称作非可空类型。

可空类型的创建使用

可空类型是基于另外一个已声明类型,这个类型是底层类型。

可以从任何值类型创建可空类型,包括预定义的简单类型。但不可以从引用类型或其他可空类型创建可空类型。另外也不需要在代码中显式声明可空类型,只需要声明可空类型的变量即可,编译器会自动隐式创建可空类型。

//可空类型语法规则
//<data_type> ? <variable_name> = null;
int? var1 = null;  //int为底层类型
int? var2 = 45;

在读取可空类型的变量时,和读取其他类型的变量一样,但如果可空类型的变量为null时,在读取时会产生异常。

//判断可空类型变量的是否包含值
int? var1 = 45;
if(var1 != null)
{Console.WriteLine("hello world,My ID is{0}",var1);
}

可空类型和非可空类型的之间转换

  • 非可空类型和其可空类型之间存在隐式转换,即不需要强制转换
  • 可空类型和其非可空类型之间存在显示转换
int? var1 = 10;   //把int隐式转换为int?
int var2 = (int)var1;  //把int?显示转换为int

可空类型赋值

可以为可空类型的变量赋3种类型的值

  • 其底层类型的值

  • 相同可空类型的值

  • null值

    int? var1,var2,var3;var1 = 10;           //底层类型的值
    var2 = var1;         //可空类型的值
    var3 = null;         // nullConsole.WriteLine("var1 {0},var2 {1}",var1,var2)
    

C#图解教程(第三章)相关推荐

  1. Blend4精选案例图解教程(三):一键拖拽

    原文:Blend4精选案例图解教程(三):一键拖拽 拖拽效果,常规实现方法是定义MoveLeftDwon.MoveLeftUp.MouseMove事件,在Blend的世界里,实现对象的拖拽,可以不写一 ...

  2. Android Camera2 教程 · 第三章 · 预览

    Android Camera2 教程 · 第三章 · 预览 DarylGo关注 Android Camera 上一章<Camera2 开启相机>我们学习了如何开启和关闭相机,接下来我们来学 ...

  3. 软考 程序员教程-第三章 数据库基础知识

    软考 程序员教程-第三章 数据库基础知识 第三章 数据库基础知识 3.1 基本概念 数据库系统(DataBase System,DBS)由数据库(DataBase,DB).硬件.软件和人员4大部分组成 ...

  4. c语言多个附加说明符,C语言教程第三章.ppt

    <C语言教程第三章.ppt>由会员分享,可在线阅读,更多相关<C语言教程第三章.ppt(36页珍藏版)>请在人人文库网上搜索. 1.第三章,顺序结构程序设计 数据输入输出 及程 ...

  5. matlab中任意两边之和大于第三边,MATLAB教程第三章.ppt

    <MATLAB教程第三章.ppt>由会员分享,可在线阅读,更多相关<MATLAB教程第三章.ppt(34页珍藏版)>请在人人文库网上搜索. 1.MATLAB程序语言设计, ,第 ...

  6. 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现

    北京 | 深度学习与人工智能 12月23-24日 再设经典课程 重温深度学习阅读全文> 正文共3017个字.11张图.预计阅读时间:8分钟 前言 梯度下降法(Gradient Descent)是 ...

  7. 偏微分方程简明教程第三章部分答案

    偏微分方程简明教程答案 第三章 分离变量法 习题3.2 3.2.1 3.2.5 3.2.9 第三章 分离变量法 习题3.2 3.2.1 1.求弦振动方程 u t t − a 2 u x x = 0

  8. LLVM极简教程: 第三章 LLVM IR代码生成

    第三章 LLVM IR代码生成 原文: Code generation to LLVM IR 本章简介 欢迎进入"用LLVM开发新语言"教程的第三章.本章将介绍如何把第二章中构造的 ...

  9. Python基础教程 | 第三章 字符串

    1. 基本字符串操作 标准序列操作:索引.分片.乘法. 成员资格.长度.最大最小值 >>> website = 'www.baidu.com' >>> websit ...

最新文章

  1. React是如何在后台运行的
  2. Python导出Excel文件
  3. 并发 --- 31 进程锁 守护进程 进程队列
  4. numpy dot()函数(两个数组的点积)(对于二维阵列,它是矩阵乘积)
  5. 长寿的人会有的8个健康理念
  6. 纯JPA 入门小案例(2)
  7. 0基础怎么学web前端?新手到大神的进阶路线在这!
  8. SQL语句导致性能问题
  9. 2014-04-08 创新点整理
  10. 数据结构----二路归并排序
  11. php GD绘图技术(实战)
  12. Android实现播放音乐列表
  13. 目标网站https://music.163.com/discover/toplist
  14. 计算机专业mx330够用吗,这款新的HP笔记本电脑配备了MX330图形卡,那么性能如何?...
  15. FZU - 2301 H - Chosen by god (组合数学)
  16. 河北工程科技学院计算机专业,计算机科学与技术系与河北工程大学信息与电气工程学院联合召开一流专业建设交流会...
  17. 世界上最健康的程序员作息表「值得一看」
  18. 正则表达式匹配替换网址
  19. MySQL基本管理(库管理与表管理)
  20. 计算机文字录入培训大纲,《计算机文字录入》课程教学大纲.doc

热门文章

  1. scrapy框架开发爬虫实战——采集BOSS直聘信息【爬虫进阶】
  2. MATLAB人脸识别疫情防护门禁系统GUI设计与实现
  3. SAP HANA是什么 和SAP Fiori 是什么
  4. android自动更新应用未安装
  5. x230可以装win10吗_联想x230i笔记本用U盘安装win10专业版的操作教程
  6. 手机测试软件 lg g5,LG G5评测:系统功能初体验
  7. 游戏盾一个深藏功与名的盾
  8. 毕业论文中的数据分析无从下手?
  9. PyQt5 如何改变各控件的叠置顺序(有遮盖情况)
  10. 这样的团建,真羡慕skr人~