开发环境:Visual Studio 2013 Ultimate
跟进课程:刘铁猛《C#语言入门详解》全集
P3 C#语言入门详解003初识类与名称空间
// 创建项目控制台应用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// using 把命名空间引用到程序中,引用过多可能导致命名空间冲突
// 如果有使用到某函数在上面声明命名空间中就调用该函数
// C#是一种完全面向对象的一种语言,程序本身也被认为是一个类
namespace HelloWorld
{
internal class Program /*该处浅蓝色高亮的表示类*/
{
static void Main(string[] args)
{
// 微软实现的Console类,作用是打印内容到输出窗口上
Console.WriteLine("Hello, World"); // 使用命名空间省略 System.
System.Console.WriteLine("Hello World");
System.Console.WriteLine("Hello World "); // 如果不用using的话,得重复写命名空间
}
}
}
using System;
using System.Windows.Forms;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
// 先有图书馆才能看想看的那本书(类比引入类库)
// 为显示窗口,引入类库 System.Windows.Forms
//Form form = new Form();
//form.ShowDialog(); // 在WSDN文档中查看 ShowDialog() 使用
// 为实现下面语句,需要手动一个一个的引入多个类库
// PresentationFramework、PresentationCore、System.Xml、WindowsBase
//System.Windows.Window window = new System.Windows.Window();
//window.ShowDialog();
// 使用nuget下载EntityFramework,实践下载后还是不能运行,并且上面语句运行报错
/*“System.InvalidOperationException”类型的未经处理的异常在 PresentationCore.dll 中发生 */
/* 黑盒引用,
* 1. 右键引用,添加引用,点击左侧浏览,右下角浏览本地dll文件
* 双击引用中添加进来的类库可以查看类库中有的
* 一定要有文档,不然拿到文件基本也不方便用
*/
/* 白盒引用,
* 1. 解决方案中添加存在项目MyLibrary
* 2. 右键引用,添加引用,解决方案,项目,选择上一步相同的项目名称
*/
//double result = Tools.Calculator.Sub(1, 1); // debug过程通常很长;一定要找到真正的 Root cause!
//Console.WriteLine(result);
double result = SuperCalculator.Calculator.Div(3, 0);
Console.WriteLine(result);
}
}
}
P4 C#语言入门详解004类、对象、类成员
本节内容
-
类( cass ) 是现实世界事物的模型
-
类与对象的关系
- 什么时候叫”对象”什么时候叫“实例’
- 引用变量与实例的关系
-
类的三大成员
- 属性 ( Property )
- 方法( Method )
- 事件 ( Event )
-
类的静态成员与实例成员
- 关于“绑定”( Binding )
-
类是对现实世界事物进行抽象所得到的结果
- 事物包括“物质”(实体)与”运动”( 逻辑 )
- 建模是一个去伪存真、由表及里的过程
类与对象的关系
- 对象也叫实例,是类经过“实例化”后得到的内存中的实体
- Formally “instance" is synonymous with “object“ ——对象和实例是一回事
- “飞机"与“一架飞机”有何区别?天上有(一架)飞机一一必需是实例飞,概念是不能飞的
- 有些类是不能实例化的,比如”数学”(Math class),我们不能说”一个数学"
- 依照类,我们可以创建对象,这就是“实例化
- 现实世界中常称”对象”,程序世界中常称“实例”
- 二者并无太大区别,常常混用,初学者不必迷惑
- 使用new操作符创建类的实例
- 引用变量与实例的关系
- 孩子与气球
- 气球不一定有孩子牵着
- 多个孩子可以使用各自的绳子牵着同一个气球,也可以都通过一根绳子牵着气球
类的三大成员
- 属性( Property)
- 存储数据,组合起来表示类或对象当前的状态
- 方法( Method )
- 由C语言中的函数(function)进化而来,表示类或对象”能做什么"
- 工作中90%的时间是在与方法打交道,因为它是”真正做事”、“构成逻辑”的成员
- 事件( Event )
- 类或对象通知其它类或对象的机制,为C#所特有(Java通过其它办法实现这个机制)
- 善用事件机制非常重要
- 使用MSDN文档
- 某些特殊类或对象在成员方面侧重点不同
- 模型类或对象重在属性,如Entity Framework
- 工具类或对象重在方法,如Math , Console
- 通知类或对象重在事件,如各种Timer
// 以方法为侧重的类的使用
double x = Math.Pow(2, 3);
Console.WriteLine(x);
// wpf应用程序
using System.Windows.Threading; // 添加命名空间调用声明,多线程
namespace EventSample
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer(); // 创建类的引用变量
timer.Interval = TimeSpan.FromSeconds(1); // 间隔多长时间触发事件
timer.Tick += timer_Tick; // tab tab 键快捷创建响应函数,用 += 操作符挂接函数到事件上
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
this.timeTextBox.Text = DateTime.Now.ToString();
}
}
}
静态成员与实例成员
- 静态(Static)成员在语义上表示它是“类的成员”
- 实例(非静态)成员在语义表示它是”对象的成员"
- 绑定(Binding)指的是编译器如果把一个成员与类或对象关联起来
- 不可小觑的”."操作符一成员访问
P5 C#语言入门详解005C#语言基本元素概览、初识类型、变量与方法、算法简介
-
注释和空白会被编译器过滤掉
-
构成C#语言的基本元素
- 标记 (Token):对于编译器而言有意义的记号
- 关键字( Keyword )
- 操作符( Operator )
- 标识符( ldentifier )
- 什么是合法的标识符
- 怎样阅读语言定义文档
- 大小写规范
- 命名规范
- 什么是合法的标识符
- 标点符号
- 文本
- 整数
- 多种后缀实数
- 实数
- 多种后缀字符
- 字符串
- 布尔
- 空( null )
- 整数
- 注释与空白
- 单行
- 多行( 块注释)
- 标记 (Token):对于编译器而言有意义的记号
-
简要介绍类型、变量与方法
-
算法简介
命名
驼峰式命名法
- 驼峰式命名法,又叫小驼峰式命名法(所以自然就存在大驼峰命名法啦……)。
- 该命名规范,要求第一个单词首字母小写,后面其他单词首字母大写,简单粗暴易学易用。
- EX:
int myAge; char myName[10]; float manHeight;
帕斯卡命名法
- 帕斯卡命名法,又叫大驼峰式命名法。
- 与小驼峰式命名法的最大区别在于,每个单词的第一个字母都要大写
-
- EX:
int MyAge; char MyName[10]; float ManHeight;
- EX:
匈牙利命名法
- 匈牙利命名法是早期的规范,由微软的一个匈牙利人发明的,是 IDE 还十分智障的年代的产物。那个年代,当代码量很多的时候,想要确定一个变量的类型是很麻烦的,不像现在 IDE 都会给提示,所以才产生了这样一个命名规范,估计现在已经没啥人用了吧……一个十分系统却又琐碎的命名规范。
- 该命名规范,要求前缀字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,单词第一个字母大写
- Ex:
int iMyAge; # "i": int char cMyName[10]; # "c": char float fManHeight; # "f": float
下划线命名法
- 下划线命名法并不如大小驼峰式命名法那么备受推崇,但是也是浓墨重彩的一笔。尤其在宏定义和常量中使用比较多,通过下划线来分割全部都是大写的单词。
- 该命名规范,也是很简单,要求单词与单词之间通过下划线连接即可。
- Ex:
int my_age; char my_name[10]; float man_height;
创建的对象中,写的方法默认私有,不允许外部访问
- 方法名应该是一个动词或者动词短语
初识类型、变量和方法
- 初识类型 ( Type )
- 亦称数据类型( Data Type
- 变量是存放数据的地方,简称”数据
- 变量的声明
- 变量的使用
- 方法(旧称函数 )是处理数据的逻辑,又称”算法
- 方法的声明
- 方法的调用
- 程序=数据+算法
- 有了变量和方法就可以写有意义的程序了
P6 详解类型、变量与对象(上)
本节内容
- 什么是类型
- 类型在C#语言中的作用
- C#语言的类型系统
- 变量、对象与内存
什么是类型( Type )
- 又名数据类型 ( Data Type )
- A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values.
- 是数据在内存中存储时的“型号”
- 小内存容纳大尺寸数据会丢失精确度、发生错误
- 大内存容纳小尺寸数据会导致浪费
- 编程语言的数据类型与数学的数据类型不完全相同
- 强类型语言与弱类型语言的比较
- C语言示例 :if条件
- JavaScript示例:动态类型 – 变量在运行时代码可以根据某些条件改变自身结构。
- C#语言对弱类型/动态类型的模仿
- 在C语言总能够编译通过,C语言中没有bool类型,混用,非零为true
类型在C#语言中的作用
-
一个C#类型中所包含的信息有:
- 存储此类型变量所需的内存空间大小
- 此类型的值可表示的最大、最小值范围
- 此类型所包含的成员(如方法、属性、事件等)
- 此类型由何基类派生而来
- 程序运行的时候,此类型的变量在分配在内存的什么位置
- 程序的静态,指数据在硬盘中,比如编译过程
- 程序的动态,指数据从硬盘加载到内存中,比如调试状态、双击运行
- Stack简介:在内存中,所占空间比较小,加载速度快
- Stack overflow
- Heap简介
- 使用Performance Monitori查看进程的堆内存使用量
- 关于内存泄漏
- 此类型所允许的操作(运算)
-
StackOverFlow
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQGtDRxg-1679501240547)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230318230638463.png)]
栈使用实例
- 在C#中使用指针(需要开启允许unsafe选项)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6g5Rf0G-1679501240548)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319100834429.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5D7Bz52y-1679501240548)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319101039196.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qHT7XOVF-1679501240549)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319101143480.png)]
WPF应用程序,堆使用实例
-
观察内存使用,windows下的进程监视器
-
cmd> perfmon
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjvOk1ZV-1679501240549)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319102748684.png)] -
可以用来检查程序是否占用过多内存,或者程序那些操作会占用内存
-
打开perfmon窗口后,首先 通过❎按钮,取消当前默认监视的系统进程,通过 ➕ 添加需要监视进程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZzDVlub-1679501240549)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319104430656.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98o0bZOb-1679501240550)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319104556803.png)]List<Window> winList; private void Button1_Click(object sender, RoutedEventArgs e) { winList = new List<Window>(); for(int i = 0; i<15000; i++) { Window w = new Window(); winList.Add(w); } } private void Button_Click(object sender, RoutedEventArgs e) { winList.Clear(); }
P7 详解类型、变量与对象(上)
C#语言的类型系统
- C#的五大数据类型
- 类(Classes):如Windows, Form, Console, String
- 结构体(Structures):如lnt32, lnt64, Single, Double
- 枚举(Enumerations):如HorizontalAlignment, Visibility
- 接口(Interfaces)
- 委托(Delegates)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bUpnI1o-1679501240550)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319104833144.png)]
- 基本类型又称内嵌类型,表示其他类型都由它们构成
- 所有类型都以Object类型为基类型
- 蓝色的表示已经存在的实际类型,虚线以下的表示可供用户定义的对应类型,
- 如object、string表示内嵌的已经创建好的类类型
- 如引用类型可以通过class创建类类型、interface创建接口类型、delegate创建委托类型
- 最后的一组表示bool类型的取值、空返回值、空值,以及模拟弱类型语言编程定义变量的关键字
变量、对象与内存
- 什么是变量
- 表面上来看,变量的用途是存储数据
- 实际上,变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量
- 变量一共有7种
- 静态变量,实例变量(成员变量,字段),数组元素,值参数,引用参数,输出形参,局部变量
- 狭义的变量指局部变量,因为其它种类的变量都有自己的约定名称
- 简单地讲,局部变量就是方法体(函数体)里声明的变量
- 变量的声明
- 有效的修饰符组合(opt)+类型+变量名+初始化器(opt,比如 = 号)
- 变量 = 以其变量名对应的内存地址为起点的,以其变量类型所要求的存储空间为长度的一块内存区域
- 值类型的变量
- 以 byte/sbtye/short/ushort 为例
- 值类型没有实例,所谓的“实例”与变量合而为一
- 引用类型的变量与实例
- 引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址
- 变量的默认值
- 常量(值不可改变的变量)
- 装箱与拆箱(Boxing&Unboxing)
七种变量中的部分实例
class Program
{
static void Main(string[] args)
{
//类类型 class
//Type myType = typeof(Form);
//Console.WriteLine(myType.FullName);
//Console.WriteLine(myType.IsClass);
//Form // F12跳转类定义
// 结构体类型struct:int、long
// 枚举类型
// 窗体尺寸只有三种,最小化、最大化、默认值窗口大小
//Form f = new Form();
//f.WindowState = FormWindowState.Maximized; // 同样可以通过F12查看该枚举类型定义 enum
//f.ShowDialog();
int[] array = new int[100];// 数组
array[0] = 1; // 第一个元素
array[99] = 99; // 最后一个元素
int x; // 局部变量
}
}
class Student
{
public static int Amount; // 静态成员:隶属于类的,而不是这个类的实例
public int Age; // 字段,相较于属性,属性能够设置一套规则避免不合理的赋值
public string Name;
public double Add(double a /*值参数变量*/, ref double b /*引用参数变量*/, out double c /*输出参数变量*/)
{
double result = a + b;
c = result;
return result;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YosJZvaM-1679501240550)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319172533004.png)]
-
一个字节由8个byte组成
-
高位由0补齐(区分大端、小端存储)
-
位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。
-
字节 byte:8个二进制位(bit)为一个字节(B),最常用的单位。 (我也常说一个字节占8位)
-
01100100 = 100;按位取反+1 = 10011100 = -100
-
-
若需要分配的内存大于一个字节,比如两个字节需要遵循高八位对应第一个字节、低八位分对应第二个字节(区分大端、小端存储)