类型、存储和变量

C#程序是一组类型声明


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

  • C#程序或DLL源码是一组一种或多种类型声明
  • 对于可执行程序,类型声明中必须有一个包含Main方法的类
  • 命名空间是一种把相关类型声明分组并命名的方法

类型是一种模板


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

类型由下面的元素定义:

  • 名称
  • 用于保存数据成员的数据结构
  • 一些行为及约束条件

例:short类型和int类型


实例化类型


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

  • 实例化类型创建的对象称为类型的实例(对象)
  • C#程序中,每个数据项都是某类型的实例。类型可以是语言自带的、BCL或其它库提供的,或是程序员定义的

数据成员和函数成员


  • 数据成员:保存了与这个类的对象或作为一个整体的类相关的数据
  • 函数成员:执行代码。函数成员定义类型的行为

预定义类类型


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

  • 简单类型

    • 11种数值类型

      • 不同长度的有符号和无符号整数类型
      • 浮点数的float和double
      • 高精度小数类型decimal(常用于货币计算)
    • 一种Unicode字符类型 char
    • 一种bool类型,布尔值只能为true或false
  • 非简单类型
    • string Unicode字符数组
    • object 所有其他类型的基类
    • dynamic 使用动态语言编写程序集时使用

所有的预定义类型都直接映射到底层的.NET类型。C#类型名称就是.NET类型的别名,
所以可以使用.NET类型名称替代C#类型名,但不鼓励这样做。


用户定义类型


用户可以自定义6种类型

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

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

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

栈和堆


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

栈是一个LIFO(Last-In First-Out,后进先出)的内存数组。
栈存储以下几种类型数据

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

栈的特征

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

在堆里可以分配大块内存来存储某类型的数据对象。
与栈不同,堆里的内存能以任意顺序存入或移除。

CLR的GC(Garbage Collector,垃圾收集器)自动删除堆上不再访问的数据。


值类型和引用类型


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

存储引用类型对象的成员

如果数据是另一个对象的成员,那么它的存储会有些不同

  • 引用类型对象的数据部分始终存放在堆里
  • 值类型对象,或引用类型数据的引用部分可以存在堆里,也可以存在栈里,这取决于实际情况

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


C#类型的分类

变量


变量允许程序存取数据

  • 变量是一个名称,表示程序执行时存储在内存中的数据
  • C#提供4种变量

静态类型和dynamic关键字


每个变量都有变量类型,这样编译器就可以确定运行时需要的内存总量以及哪些部分应该存在栈上,哪些存在堆上。
变量类型在编译时就确定且不能在运行时修改,这叫静态类型。
dynamic代表一个特定的、实际的C#类型,它知道如何在运行时解析自身。

可空类型


某些情况下,特别是使用数据库时,你希望表示变量目前未保存有效的值(数据库中的null)。
对于引用类型,你可以直接把变量设置为null,但值类型不行。
可空类型允许创建可以标记为有效或无效的值类型

int? i =;
double? d1 =3.14;
bool? flag =null;
char? letter ='a';
int?[] arr =newint?[];

C# 图解教程 第三章 类型、存储和变量的更多相关文章

  1. 【卷土重来之C#学习笔记】(三) 类型 存储和变量

    .c#程序是一组类型声明 ※C#程序或DLL的源代码是一组一种或多种类型声明 ※对于可执行程序,类型声明必须有一个包含Main方法类 ※命名空间是一种把相关的类型声明分组并命名的方法.既然程序是一组相 ...

  2. [ABP教程]第三章 创建、更新和删除图书

    Web应用程序开发教程 - 第三章: 创建,更新和删除图书 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以 ...

  3. [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程

    [Learn Android Studio 汉化教程]第三章:使用 Android Studio 编程 本章包含如何在 Android Studio 中书写或生成代码. Android Studio ...

  4. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  5. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

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

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

  7. 《JS权威指南学习总结--第三章类型、值和变量》

    第三章 类型.值和变量 内容要点 一.数据类型 1.在编程语言中,能够表示并操作的值的类型称做数据类型 2.JS的数据类型分为两类: 原始类型:数字.字符串和布尔值 对象类型 3.JS中有两个特殊的原 ...

  8. javascript进阶教程第三章--匿名和闭包--案例实战

    javascript进阶教程第三章--匿名和闭包--案例实战 一.学习任务 通过几个小练习回顾学过的知识点 二.实例 练习1: 实例描述:打开页面后规定时间内弹出一个新窗口,新窗口指定时间后自动关闭. ...

  9. C#_02.12_基础二_.NET类型存储和变量

    C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...

随机推荐

  1. POJ 3621 Sightseeing Cows [最优比率环]

    感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html 现在不也是嘛 裸题,具体看学习笔记 二分答案之后判负环就行了 $dfs$ ...

  2. ES6的Symbol

    let s = Symbol(); alert(typeof(s)); // Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比 ...

  3. 小甲鱼OD学习第11讲

    这次我们的任务是破解这个需要注册的软件,如下图所示 我们这次从字符串入手,我们查找 unregistered  字符串 然后我们在如下图的字符串下断点 然后我们来到断点处,我们观察到 地址为 0040 ...

  4. typedef介绍

    1.typedef是什么? typedef是C中的类似于extern/static的一个关键字,用于为一种类型引入一个新的名字.并不会分配内存. 2.typedef常见用法? 1) typedef i ...

  5. 调试 smallcorgi/Faster-RCNN_TF 的demo过程遇到的问题

    最近在调试faster R-CNN时,遇到了各种各样的问题.使用的算法库为https://github.com/smallcorgi/Faster-RCNN_TF 注:本文使用的是通过virtuale ...

  6. EntityFrameWork实现部分字段获取和修改(含源码)

    EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的.以下介绍的2个功能点分别是部分字段更新和获取 解决部分字段Update.本方案采用仓储模 ...

  7. 可拖动布局之Gridster

    看过bootstrap可视化布局系统的人是不是都会对页面元素的拖拽有着很大的兴趣?下面呢,楼主就给大家讲两个楼主知道的拖拽小插件吧. 一.gridster 1.了解gridster 后续官网:http ...

  8. java1 - 环境与简介

    一.阅读 JAVA历史 回答以下问题: JDK 是什么? JRE 是什么? java 有那三大平台? java 开发工具有那些? java 可以在那些系统上面做开发? java 工程师可以做什么? 二 ...

  9. PHP二维数组排序(感谢滔哥)

    滔哥原创 /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\|| ...

  10. qt Multimedia 模块类如何使用?

    qt 多媒体模块介绍 类名 英文描述 中文描述 QAudioBuffer Represents a collection of audio samples with a specific format ...