类型、存储和变量

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. 2018/1/27 Zookeeper实现分布式锁

    public class DistributedClient { // 超时时间 private static final int SESSION_TIMEOUT = 5000; // zookeep ...

  2. SDN第四次作业

    作业链接 1.阅读 了解SDN控制器的发展 http://www.sdnlab.com/13306.html http://www.docin.com/p-1536626509.html 了解ryu控 ...

  3. sql的升阶

    前言:基本数据库操作根本无法满足实际的需要,需要引入更多的操作. 触发器-隐式的,主动的,更新数据表中的信息.带有inserted和deleted两个临时表,代表新操作和旧操作. 它是一种特殊的存储过 ...

  4. LeetCode - 653. Two Sum IV - Input is a BST

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

  5. 模板方法模式和JDBCTemplate(一)

    本篇博客的目录: 一:模板方法模式介绍 二:模板方法模式的简单实现 三:总结 一:模板方法模式的介绍 1.1:模板方法模式的定义 定义:一个操作中的算法的骨架,而将一些步骤延迟到子类中.Templat ...

  6. 从Myeclipse到Intelj Idea

    前言:经历了从eclipse到Myeclipse的时间,大学时候用Eclipse,开始工作的时候选择Myeclipse,都能体会到Java的IDE的先进和高明之处,直到最近,公司项目采git和Grad ...

  7. 织梦去除tag标签url中的问号

    找到文件 include\taglib\tag.lib.php  大概87行 把 $row['link'] = $cfg_cmsurl."/tags.php?/".urlencod ...

  8. object类的equals方法简介 & String类重写equals方法

    object类中equals方法源码如下所示 public boolean equals(Object obj) { return this == obj; } Object中的equals方法是直接 ...

  9. 怎样才能收集到所有开发人员的blog(待续…)

    第一个问题,如何找到尽可能多的博客地址? 1. 找到一个知名blog, 遍历这个博客的外链. 2. 遍历找到的外链,并以同样逻辑找到其他博客. 3. 如果遍历到的博客地址已经存在则停止遍历. 还有一种 ...

  10. CentOS 7.3 minimal 开启网络服务

    CentOS7解决不能上网问题 1.先进入控制台 输入ip addr 2.然后su 获取超级管理员权限 3.编辑网络配置文件 vi  /etc/sysonfig/network-scripts/ifc ...