C# 学习之路(类型、存储和变量)

news2024/12/22 18:14:01

C# 学习之路(类型、存储和变量)


  • C# 是一组类型声明

如果泛泛的描述 C 和 C++ 程序源代码的特征,可以说 C 程序是一组函数和数据类型,C++ 是一组函数和类,而 C# 程序是一组类型的声明。

命名空间是一种将相关的类型声明分组并命名的方法。因为程序是一组相关的类型声明,所以通常在你创建的命名控件内部声明程序类型。

  • 类型是一种模板

C# 程序是一组类型的声明,那么学习 C# 就是学习如何创建和使用类型。

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

类型由下面的元素定义:

  1. 名称
  2. 保存数据成员的数据结构
  3. 行为及约束条件
// 个人理解
class node // 名称
{
    int a,b; // 成员数据
    void fun() // 行为约束
    {
        Console.WriteLine($"{a}, {b}");
    }
}

// 书本图示
 ----------------------
|名称  short| 结构  2字节|
 ----------------------
|     行为  16位整数     |
 ----------------------

 ----------------------
|名称   int | 结构  4字节|
 ----------------------
|     行为  32位整数     |
 ----------------------
  • 实例化类型

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

通过实例化类型而创建的对象被称为类型的对象或者类型的实例

short a1,a2,a3; // a1、a2、a3成为short的实例
int b1,b2,b3; // b1、b2、b3成为int的实例
  • 数据成员和函数成员

像 short 、int 和 long 这样的类型称为简单类型,这种类型只能存储一个数据项。

其它的类型可以存储多个数据项,列如:数组(array)类型就可以存储多的同类型的数据项,这样的数据项被称为数组元素。通过索引来引用这些元素。

成员的类别

有一些的类型可以包含许多不同的数据项,这些类型中的数据项个体成为成员,与数组中使用数字来引用成员不同,这些成员有独特的名字。

两种成员:数据成员和函数成员

数据成员:保存了与这个类的对象或整个类相关的数据。

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

// 类型为 XYZ de 一些数据成员和函数成员
XYZ
{
 datamem1; // 数据成员
 datamem2; // 数据成员

 F1(){
     ExecuttableCode // 函数成员
 }
 F1(){
     ExecuttableCode // 函数成员
 }
}
  • 预定义类型

C# 提供了 16 种预定义类型,其中包括 13 种简单类型和 3 种非简单类型。

所有预定义类型的名称都由全小写的字母组成。预定义的简单类型包含以下 3 种

  • 11 种数值类型

    不同长度的有符号和无符号整数类型

    浮点数类型 float 和 double

    decimal 高精度小数类型,与 float 和 double 不同,decimal 类型可以准确地表示分数。

  • 一种 Unicode 字符类型 char

  • 一种 bool 类型,bool 类型表示布尔值,必须为 true 或 false。(C# 中的数值类型不具有布尔含义)

3 种非简单类型如下

  • string,Unicode 字符数组
  • object,这是所有其他类型的基类
  • dynamic,使用动态语言编写的程序集时使用

在这里插入图片描述

  • 用户定义类型

除了 C# 提供的 16 种预定义类型,还可以创建自己的用户定义类型。有 6 种类型可以由用户创建

  • 类 类型(class)
  • 结构类型(struct)
  • 数组类型(array)
  • 枚举类型(enum)
  • 委托类型(delegate)
  • 接口类型(interface)

通过类型声明创建类型,类型声明包含以下信息:

  • 要创建的类型的种类
  • 新类型的名称
  • 对类型中每个成员的声明(名称和规格),array 和 delegate 类型除外(这两类不含有命名成员)
class AA // 类型 class 名称 AA
{
    int a,b; // 成员声明
    double c,d;
}
  • 栈和堆

运行中程序使用两个内存区域存储数据:

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

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

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

程序在堆里保存数据,但并不能显示的删除它们。CLR 的自动垃圾收集器在判断程序的代码将不会再访问某一数据项时,会自动清除无主的堆对象。

在这里插入图片描述

  • 值类型和引用类型

数据项的类型(int、double、short 等)定义了存储数据需要的内存大小及组成该成员类型的数据成员。类型还决定了在内存中的存储位置——栈或堆

类型被分为两类:值类型引用类型,这样两种类型的对象在存储方式上不同。

在这里插入图片描述

C# 图解教程第五版(P39)表4-3是错误的

  • 值类型只需要一段独立的内存,用于存储实际的数据。(数据存储在栈里)
  • 引用类型需要两段内存(实际数据存放在堆里,引用存放在栈里)
    • 第一段存储实际的数据,它总是位于堆中
    • 第二段是一个引用,指向数据在堆中的存放位置

在这里插入图片描述

  • 变量

变量表示程序执行时存储在内存中的数据,C# 提供 4 种变量。

名称描述
本地变量在方法的作用域保存临时数据,不是类型成员
字段字段是在(class)或结构体(struct)中直接声明的任意类型的变量。 字段是其包含类型的成员
参数用于从一个方法到另一个方法传递数据的临时变量,不是类型的成员
数组元素同类数据项构成的有序集合的一个成员,可以为本地变量,也可为类型的成员
  • 变量声明

变量使用前必须声明,变量声明定义了变量,并完成两件事:

  1. 给变量命名,并为它关联一种类型
  2. 让编译器为它分配一块内存
int var1;
类型 值
  • 变量初始化

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

int va1 = 10;
  • 自动初始化

一些类型的变量如果在声明时没有初始化,那么会被自动设置为默认值,而另一些则不能。

变量类型存储位置是否自动初始化用途
本地变量栈、栈和堆用于函数成员内部的本地计算
类字段类的成员
结构字段栈、堆结构的成员
参数用于把值传入或传出方法
数组元素数组的成员
  • 多变量声明
  1. 声明的变量类型必须相同
  2. 变量名之间必须用逗号分隔,可以在变量名的后面包含初始化语句
int var1 = 1, var2 = 2;
double var3 = 0.1, var4;
  • 静态类型和 dynamic 关键字

dynamic 类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查

  • 可空类型

可空类型允许创建可以标记为有效或无效的值类型变量,这样就可以在使用它之前确定值得有效性.普通得值类型称为非可空类型.

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

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

相关文章

mongodb 5.0.14 副本集 安装 单机版 记录

1、下载tgz 连接地址:mongodb 5.0.14下载 2、创建用户 useradd mongouserpasswd mongouser 3、解压tgz wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.14.tgz tar -zxvf mongodb-linux-x86_64-rhel70-5.0.14.tgz 4、拆分3个独立的mo…

编程团体赛

目录 1047:编程团体赛 输入格式: 输出格式: 输入样例: 输出样例: 思路: 代码: 时间复杂度: 总结: 题目链接: 1047:编程团体赛 编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛&a…

Protocol buffe vs Json 为什么还会大量使用Json?

JSON:的最大优点就是可读性好,但是体积大。 Protocol Buffers:最大的特点就是体积小,传输需要带宽小,速度快。但是可读性较差 尽管JSON和Protobuf消息可以互换使用,但这些技术的设计目标不同。JSON代表Ja…

【元胞自动机】格子波尔兹曼模型及其应用研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

我去!Python 不愧是脚本之王,这 23 种命令行用法你全部 get 了吗?

1. 快速打印函数的调用栈 在阅读源码的时候,有时候我们想要看整个程序的调用栈是怎样的? 比较常规的做法是使用全局搜索函数,一层一层往上走,效率非常之低。 而我习惯了使用 pdb 对代码进行调试,在使用pdb时&#x…

vscode环境中配置git

1. 建立project空目录用于存放electron基本环境这个环境中得文件不能加入git项目中否则每次更新文件太大github不支持大于100M得文件上传 2. 使用vscode打开project目录 3.打开终端运行npm install electron 运行完成后会生成electron相关得两个json文件和一个文件夹 4.新建一个…

读取图片输出字符图案:用字符输出足球的图案

用字符输出足球的图案前言功能描述实现思路代码实现1️⃣ 获取像素点的RGB数值2️⃣ 判断每个像素点的RGB值是否符合3️⃣ main方法结果测试前言 世界杯,如火如荼的进行着,作为程序员也参加一下活动,蹭一下世界杯的热度 功能描述 通过读取足球…

跨行新手学习并备考阿里云云计算专业认证ACP大概需要多长时间呢?

先来了解一下阿里云认证: 阿里云认证是基于核心技术及岗位的权威认证, 阿里云针对不同产品类别、用户成长阶段、生态岗位,精心打造不同的认证考试。 个人:证明您在对应技术领域的专业度,能够基于阿里云产品解决实际问…

(附源码)spring boot投票系统 毕业设计 261136

基于springboot投票系统 摘 要 在科学管理机制越来越完善的今天,投票管理者只能依赖手工记录数据,这不仅仅浪费时间,并且对人力也是一种浪费,不能做到随时监控,对数据的准确性和及时性也是一种影响。所以投票非常急需一套既有与时…

Python到底适合什么后端团队和项目?

前言 1、我的Python从业经历 本人从2015年开始基本上都在使用Python语言,主要做扫描器、分布式任务、后台接口、AI、图像和3D点阵处理、数据接收处理等等,也待过几个公司,所在部门基本上也是多种语言的开发小组都有,统计了下如下…

JAVA五子棋手机网络对战游戏的设计与实现(源代码+论文)

五子棋网络对战游戏的设计与实现 论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期: 五子棋网络对战游戏的设计与实现 摘 要 在现代社会中,及其它无线设备越来越多的…

铁矿行业BI经营分析框架(四)经营分析

在中国大部分的铁矿企业集团都是有央国企背景的,都是属于一个大集团下的二级集团性企业。所以,首先是需要背上集团下发的经营业绩指标的,这个一定是整个经营管理分析的核心要重点关注。 业绩情况 第一个分析要点就是这家企业集团在整个集团中…

Matplotlib入门[04]——处理图像

Matplotlib入门[04]——处理图像 参考: https://ailearning.apachecn.org/Matplotlib官网 图片来源:百度(如有侵权,立删) 使用Jupyter进行练习 import matplotlib.pyplot as plt import matplotlib.image as mpimg imp…

sqlserver时间字段索引失效,重建后索引又正常了

文章目录前言索引相关操作1 、查看全部索引信息2 、重建所有表索引3 、查看某个表索引信息4 、重建某个表索引查询索引字段说明执行修复索引字段前言 这几天被一个项目搞得烦死了,客户老是反馈后台查询前一天注册的用户数据失败,看了错误日志&#xff0…

【Java面试】能说说你对volatile关键字的理解吗?

文章目录volatile能否保证线程安全?原子性可见性有序性volatile能否保证线程安全? 下文使用到了javap命令进行class文件的反汇编来查看字节码,如果想要了解的可以学习一下javap命令。 什么是javap命令 javap命令的参数 要解决这个问题首先要…

【数据库】数据库的慢查询问题

现象: 在压测过程中发现接口返回数据非常慢,甚至超时,页面加载不出数据 问题定位:如果有慢查询怎么恢复? 1.查看服务日志,打印连接数据库超时,接口返回超时 查看数据库所在节点cpu占用很高使…

夯实算法-跳跃游戏

题目:LeetCode 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入: nums [2,3,1,1,4] 输出: tru…

【测试沉思录】23. 如何实现基于场景的接口自动化测试用例?

作者:陈爱娇 编辑:毕小烦 自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码,最小的投入,完成自动化测试的工作。 基于这…

EMQ 宣布推出 LF Edge eKuiper 全新 Logo 标识

全球领先的开源物联网数据基础设施软件供应商 EMQ 映云科技宣布,即日起,将正式启用全新的 LF Edge eKuiper(以下简称 eKuiper)产品 Logo。焕然一新的 eKuiper 产品 Logo 标志着 EMQ 在不断提升品牌全球化战略之上,对于打造高性能、高可用、高安全的世界级开源软件产品的极致追求…

关于密码设置

使用一个密码并在数据泄漏时保护自己的其它账号 关于密码 现在好多软件,好多网站都需要我们设置密码,这个时候我们的处理办法一般分为2种。 对不同的软件设置不同的密码,这种理论上是最安全的,但是记不住啊,所以不实…