刨析Helloworld 程序
类(水蓝色)
C#完全面向对象的语言
类的首字母要大写
名称空间的标记{}
使用全限定名 System.Console.WriteLine
注意类名的冲突,精确的类名放到指定的namespace
如何确定某个类属于哪个类属于哪个名称空间
Ctrl+.
检索 class
类库的引用 (物理基础)
Dll引用(黑盒引用,无源代码)
Add Reference -> using namespace
有依赖关系
写程序时尽量减少依赖关系
Assemblies: 程序集,装配件
NuGet 简介
项目引用(白盒引用,有源代码)
Add new project-> class Library->add reference -> add ShardProjects -> using namespace
修bug找routcause
依赖关系
类(或对象)之间的耦合关系
优秀的程序追求“高内聚,低耦合”
UML(通用建模语言 )类图
类
1. 类(Class)是现实世界事物的模型
类是对现实世界事物进行抽象所得到的结果
事物包括“物质”(实体)与“运动”(逻辑)
建模师一个去伪存真,由表(interface)及里(隐藏的)的过程
唯物辩证法
2. 类与对象的关系
对象也叫实例,是类经过“实例化”后得到的内存的实体
依照类,我们可以创建对象,这就是“实例化”
使用new操作符进行实例化
3. 引用变量与实例的关系
他们之间的关系就像孩子与气球;
气球(实例)不一定有孩子(引用变量)牵着
有小孩,但是不牵着气球
多个孩子可以使用各自的绳子牵着气球
也可以都通过一根绳子牵着气球(ref参数修饰符)
4. 类的三大成员
属性(Property)
存储数据,组合起来表示类或者对象当前的状态
高富帅(Personclass: 身高属性,财产属性,相貌属性)
方法(Method)
由C语言中的函数(Function)进化而来,表示类或者对象“能做什么”
工作中90%的时间是在与方法打交道,因为它是”真正做事”,“构成逻辑”的成员
事件(Event)
类或对象通知其他类或对象的机智,为C#所特有的
善用事件机制非常重要
5. 使用MSDN文档
static voidCreateMyForm()
{
// Create a newinstance of the form.
Form form1 = newForm();
// Create twobuttons to use as the accept and cancel buttons.
Button button1 = newButton ();
Button button2 = newButton ();
// Set the text ofbutton1 to "OK".
button1.Text = "OK";
// Set theposition of the button on the form.
button1.Location = newPoint (10, 10);
// Set the text ofbutton2 to "Cancel".
button2.Text = "Cancel";
// Set theposition of the button based on the location of button1.
button2.Location
= newPoint (button1.Left, button1.Height + button1.Top + 10);
// Set the captionbar text of the form.
form1.Text = "MyDialog Box";
// Display a helpbutton on the form.
form1.HelpButton = true;
// Define theborder style of the form to a dialog box.
form1.FormBorderStyle =FormBorderStyle.FixedDialog;
// Set theMaximizeBox to false to remove the maximize box.
form1.MaximizeBox = false;
// Set the MinimizeBoxto false to remove the minimize box.
form1.MinimizeBox = false;
// Set the acceptbutton of the form to button1.
form1.AcceptButton = button1;
// Set the cancelbutton of the form to button2.
form1.CancelButton = button2;
// Set the startposition of the form to the center of the screen.
form1.StartPosition =FormStartPosition.CenterScreen;
// Add button1 tothe form.
form1.Controls.Add(button1);
// Add button2 tothe form.
form1.Controls.Add(button2);
// Display theform as a modal dialog box.
form1.ShowDialog();
}
某些特殊类或对象在成员方面侧重点不同
模型类或者对象重在属性(存储数据),如EntityFramework
工具类或对象重在方法(搞计算),如Math,Console
通知类或对象重在事件(),如各种Timer
静态成员与实例成员
静态(Static)成员在语义上表示它是“类的成员”(类与生俱来的)
<静电,物体固有的性质>
实例(非静态)成员在语义上表示它是“对象的成员”(成员是属于某个对象的而不是类)
<身高:实例; 平均身高:静态>
绑定(Binding)指的是编译器如何把一个成员与类或对象关联起来(早绑定:编译器编译时已经知道一个方法是属于某个类还是类的对象; 晚绑定是运行时决定, 晚绑定的语言是动态语言)
“.”操作符: 成员访问操作符
For + Tab
Cw + Tab*2
构成C#语言的基本元素
关键字(Keyword):构成一门编程语言的基本词汇,是人类自然预言的费城小的子集
操作符(Operator):运算符,表达运算思想的符号
标识符(Identifier):给变量,类,类成员取得名字
有效标识符:不能以数字开头,不能是关键字,如果要用关键字需要加@, 可以以字母(中文,英文…)或_开头
命名规范: 类: 名词; 属性: 名词; 方法:动词,动词短语
大小写规范:驼峰命名: myVariable(变量名);pasco : MyVariable(类,方法)
标点符号 :不表达运算思想,不参与运算 ;{}
文本(字面值):
整数: int x=2(32bit); long y = 3L(64bit)
实数(小数): float x=3.0F(32bit); double y =4.0D(64bit)
字符: char c= ‘A’;
Z字符串:string str = “a”/”Hello”/””;
布尔: bool b=true; bool b2= false
空: string str= null;
NullReferenceException
--------
标记(Token):对于编译器来说有意义的标识
--------
注释与空白
单行: //
多行(块注释):/* … */
什么是类型(Type)
又名数据类型(Data Type)
数据类型是性质相同的值的集合,配备了一系列具体的操作
是数据在内存中存储的“型号”
小内存容纳大尺寸数据会丢失精确度,发生错误
大内存容纳小尺寸会导致浪费
编程语言的数据类型与数据的数据类型不完全相同
硬盘(外存):扩展存储器<静态的程序在硬盘里,动态的程序在内存里>
强类型语言(C#)与弱类型语言(C)的比较
C#对弱类型语言的模仿:Dynamic
类型在C#中的作用:
一个C#类型中包含的信息有:
存储词类型变量所需的内存空间大小
此类型的值课表示的最大最小的范围
此类型所包含的成员(如方法,属性,事件等)
此类型由何基类派生而来
程序运行时,此类型的变量在分配在内存的什么位置
Stack简介: 栈方法调用(比较小)
Stack overflow
Heap简介: 堆(比较大)<实例分配在堆里的>
使用Performance Monitor查看进程的堆内存使用<perfmon>
关于内存泄漏
此类型允许的操作(运算
C#语言的类型系统:
C#的五大数据类型
类(Class):如Window,Form, Console, String 声明和定义类
结构体(Structures): 如Int32,Int64, Single, Double <Struct>
枚举(Enumerations): 限定用户只能从指定集合中拿数据<Enum>
接口(Interfaces)
委托(Delegates)
变量,对象与内存
什么是变量
表面上看(从C#代码的上下文上来看),变量的用途是存储数据
实际上,变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量
变量总共有7种
静态变量,实例变量(成员变量,字段),数组元素,值参数,引用参数,输出形参,局部变量
侠义的变量指局部变量,因为其他种类的变量都有自己的约定名称
简单的讲,局部变量就是方法体(函数体)里声明的变量
变量的声明
有效的修饰符的组合(opt)数据类型 变量名(名词) 初始化器(opt)
Public static int a =0;
变量=以变量名所对应的内存地址为起点,以其数据类型所要求的存储空间为长度的一块内存区域
值类型的变量
以byte/sbyte/short/ushort为例
值类型没有实例,所谓的“实例”与变量合二为一
负数(按位取反再加1)
高8位存储在高地址(高高低低原则)
引用类型变量装的是实例的地址
引用类型的变量与实例
引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址
局部变量是在stack上分配内存,实例在堆上分配内存
变量的默认值 (本地变量必须要与显示的初值)
常量(值不可改变的变量)
装箱与拆箱(Boxing& Unboxing)
装箱:
Int x=100;
Object obj =x;
把栈值类型的值类型的值封装成object类型的实例放在堆上。
copy然后再对内存上找一块地方,把堆内存的地址存在obj里面
拆箱:
Inty=(int) obj;
从堆上面object类型的实例里面栈上搬东西
方法的由来
方法(method)的前身是C/C++语言的函数(function)
方法是面向对象范畴的概念,在非面向对象语言中仍然称为函数
当一个函数以类的成员出现时即为方法
永远都是类(或结构体)的成员
C#语言中函数不可能独立于类(结构体)之外
只有作为类(结构体)的成员时才被称为方法
· C++中是可以得,成为全局函数
是类(结构体)最基本的成员之一
最基本的成员只有两个——字段与方法(成员变量与成员函数),本质还是数据+算法
方法表示类(结构体)“能做什么事情”
为什么需要方法和函数
目的1:隐藏复杂的逻辑
目的2:把大算法分解为小算法
目的3:复用代码(reuse,重用)
自顶向下,标准求精:面向过程
方法的声明与调用
声明方法的语法详解
声明定义不分家
Parameter 全称为“formal parameter”
形式上的参数,简称“形参”
形式参数:要进入函数体进行跑龙套,在形式上编译通过
Parameter 是一种变量
命名规范
大小写规范
需要以动词或者动词短语作为名字
重温静态(Static)方法和实例方法
调用方法:
Argument中文C#文档的翻译为“实际参数”,简称“实参”
可以理解为调用方法时的真实条件
个数,形式都要匹配,声明(形参)和调用方法(实参)要分清楚
调用方法时的argument列表要与定义方法时的parameter列表相匹配
C#是强类型语言,argument是值,parameter是变量,值与变量一定要匹配,不然编译器会报错
构造器(一种特殊的方法)
构造器(constructor)是类型的成员之一
构造器没有返回值类型;
有带参数的构造器,默认构造器将不再起作用
Ctor+ Tab*2
方法的重载(Overload)
声明带有重载的方法:
方法签名(method signature)由方法的名称,类型参数的个数和它的每一个形参(按从左到右的顺序)的类型和种类(值,引用ref或输出out)组成。方法的签名不包含返回值类型
实例构造函数签名由它的每一个参数(按从左到右的顺序)的类型和种类(值,引用ref或输出out)组成
重载决策(到底调用哪一个重载):用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。
如何对方法进行debug
设置断点(breakpoint)
观察方法调用时的call stack
栈的深度表示内存的使用越多
Step-in(F11:进入方法体), Step-over(F10:不进入函数体内),Step-out(shift+F11):直接返回调用的当前函数的方法中去
观察局部变量的值与变化
红色表示变化
操作符概览
· 操作符(Operator)也称为“运算符”
操作符是用来操作数据的,被操作的数据称为操作数(Operand)
操作符的本质
操作符的本质是函数(即算法)的“简记法”
操作符不能脱离与它关联的数据类型
可以说操作符就是与固定的数据类型相关联的一套基本算法简记法
示例:为自定义数据类型创建操作符
操作符的优先级
可以使用圆括号提高被括起来的表达的优先级
圆括号可以嵌套
只有圆括号
同级操作符的运算顺序
除了带有赋值功能的操作符,同优先级操作符都是由左向右
带有赋值功能的操作符的运算顺序是由右向左
与数学运算不同,计算机语言的同优先级的同优先级运算没有“结合律”
各类操作符的示例
基本操作符:
.操作符(成员访问操作符)
//1. 访问外层名称空间的子集名称空间
//2. 访问名称空间中的类型
//3. 访问类型的静态成员
//4. 访问对象的成员
方法调用操作符()
元素访问操作符[]