C#编程基础笔记
API 应用程序接口 类库
C++直接运行在操作系统上(OS相关)
Microsoft提供了CLR的几个版本:
桌面/服务器版本:在Microsoft Windows的32位(x86)和64位(x64/IA64 )版本上运行。 Silverlight版本:它是用和.NET Framework CLR 的桌面/服务器版一样的源代码库来生成的。
.NET Framework 有一个“简化”版本(称为.NET Compact Framework):它适合 Windows
手机和运行Windows CE 操作系统的其他设备。
本地代码编译器:生成面向特定CPU架构的(X86,X64/IA64)代码
CLR的执行模型
1、源代码编译成托管模块
CLR编译器:生成IL(中间语言)代码,IL代码也称托管代码
元数据总是嵌入和代码相同的exe/dll文件中,这使两者密不可分
2、托管模块合并成程序集:
CLR其实不是和模块一块工作的,它是和程序集一块工作的。程序集是一个或多个模块/资源文件的逻辑分组,并且程序集是重用、安全性以及版本控制的最小单元。即托管模块或资源文件等通过C#编译器(CSC.exe)、程序集连接器(AL.exe)执行后生成程序集
检查.NET Framework是否安装,查看C:\Windows\System32下的mscoree.dll文件
检查.NET Framework安装的所有版本:进入注册表编辑器(运行regedit) KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
3、加载公共语言运行时
设置生成运行程序的平台:右键解决方案资源管理器中的解决方案→生成→目标平台
Any cpu(VS2010dll文件默认) 所有window平台都可运行,X86(VS2010exe文件默认) windows 32位系统,x64 64位应用程序运行(x64 windows 64),Itanium 64位应用程序运行(IA64 Windows)
Windows 检查exe文件头,决定创建进程的版本(32、64),然后,进程的主线程调用MSCorEE.dll中定义的一个方法(初始化CLR,加载EXE程序集),然后调用入口(Main)方法,随即,托管的应用程序将启动并运行。
4、执行程序集的代码
CLR的核心功能:内存管理、程序集加载、安全性、异常处理、线程同步,可由面向CLR的所有语言使用
C#与.NET的区别
C#是一种编程语言,可以开发基于.NET Platform的应用程序,.NET(Dot Net)是指.NET Frame Work框架,是微软开发的一种多语言开发的集成Platform,是一种技术。
C#的由来
一种说法,Sharp有一种锋利的意思,可以直透别人的心脏。微软希望他可以直透其他语言的心脏。另一种说法,在C#之前最好的编程语言是C++,C#即是C++++的意思。
Java即是一种技术又是一门语言。
.NET能开发的程序包括:
桌面程序:WinFrom应用程序
Internet应用程序(网站): ASP.NET/WebService
手机开发:wp7
三层框架:
界面
业务逻辑层
数据访问层
两种模式(两种架构)
C/S:客户机(Client)/服务器模式(Server)
B/S:浏览器(Browser)/服务器模式(Server)
IDE(Integrated Development):
Visual Studio
MSDN 的全称是 Microsoft Developer Network。这是微软公司面向软件开发者的一种信息服务。MSDN 实际上是一个以 Visual Studio 和 Windows 平台为核心整合的开发虚拟社区,包括技术文档、在线电子教程、网络虚拟实验室、微软产品下载(几乎全部的操作系统、服务器程序、应用程序和开发程序的正式版和测试版,还包括各种驱动程序开发包和软件开发包)、Blog、BBS、MSDN WebCast、与 CMP 合作的 MSDN 杂志等等一系列服务。
Visual Studio 中的项目与解决方案资源管理器
解决方案资源管理器可以包含多个项目,适用于管理项目的,项目可以包含多个文件,文件中是我们写的程序;在文件中包含命名空间,命名空间中包含类,类中包含方法.
重置开发环境:工具—导入导出—重置所有设置—不保存—选择语言—确定
窗口关闭,从视图中找
Main方法是我们程序的入口方法,当我们执行程序时,首先找到main方法,从Main的第一句程序开始执行,当main方法执行完成后(即执行到main方法的反大括号),程序就结束了。
.csproj项目文件
.sln 解决方案的文件,里面记录着所有项目的信息
C#中的注释
单行注释:以//开始,之后的都为注释
多行注释:以/*开始,以*/结束,都为注释
文档注释:用于对类和方法吃的注释,在类或方法的前面加上///,进行注释
计算机中的快捷键
Home:定位到行首 End:定位当行末
PgUp:定位到上一页 PgDn:定位到页末
Ctrl+Home:定位到页首 Ctrl+End:定位到页末
Shift:按住shift键时,光标经过的地方都会被选中
对话框的复制:使对画框处于当前窗体,Ctrl+C,即可复制
#region与#endregion 折叠一段代码
聪明的程序员都会delphi
安德斯•海尔斯伯格(Anders Hejlsberg)Delphi和 .NET之父
变量
变量代表着一块内存空间,我们可以通过变量名向内存存取数据,有变量就不需要我们记忆复杂的内存地址
Int number; 申请空间
Number=123; 赋值
C#中的数据类型:声明变量
值类型:不可空数据类型(定义后不管他的内容是否有有效的含义,内存都已经分配了,因此不可空。) string str1 = null;
引用类型:可控数据类型 int? i1 = null;
注意:在C#编译环境中带小说点的数字编译为double类型,decimal类型的要加上m/M。
值类型变量作为类的全局变量会有默认值,作为局部变量,必须手动赋值
变量声明的三种方法:
1、 先声明,再赋值
2、 声明时直接赋值
3、 逗号分隔声明多个同类型的变量
变量的使用:
1、 先声明
2、 再赋值
3、 再使用(取值或者调用变量)
变量的命名规定:(C#是支持多国语言的:字母可以是任何一种语言)
1、 必须以“字母” _和@开头
2、 后面可跟字母数字下划线
注意:不能和关键字相同,C#中大小写敏感,C#中不能定义重复的变量
定长buffer
主要用在托管代码和非托管代码互操作上
C#编码规则——Camel命名法(骆驼命名法):
首个单词的首字母小写,其余单词的首字母大写
Pascal 命名规范:每一个单词第一个字母都大写,如果使用英文单词的缩写,全部用大写!
占位符:在输出语句中,第一个变量 可以使用占位符,占位符由大括号组成,数字由0开始编号{0} {1}
数据类型的使用(电话号码要用string类型,电话号码不会参与数值运算,只可能参与字符的匹配)
转义字符\
\n 换行 \b 退格 \t 用于(对齐)空格 \\ \
数据类型的自动转换(隐式转换)
1、数据类型兼容
2、小范围的数据类型,转换为大范围的数据类型 如 int double
强制类型转换
Int PI=(int)3.14; 数据类型必须兼容
ToInt32 转换为int类型
ToInt64 转换为long类型(长整形)
Convert.ToInt32(3.14); Convert不仅仅是内存级别的转换,而是加工意义的转换,数据类型可以不兼容
3.14.ToString();
C#中一元运算优于二元运算
符合运算符:
+= 、-=、*=、/=、%=
关系运算符(运算结果为bool型 true or false)
>、<、=、>=、<=、!=、==
逻辑运算符
&& 、||、!
逻辑与 逻辑或的短路
当逻辑与左边的为假的时候,右边的不执行;当逻辑或左边的为真时,右边的不执行。
程序中的结构
分支结构
if(true)
{}
else if()
{}
开关Switch(表达式\变量) { case: break;default:break;}
Switch case 只能用于判断确定的值; if else 用于判断范围的数据
循环While(true){}
do{} while(true);
注:大扩号在语句的结束可以不加分号,小括号在语句的结束必须加括号
Ctrl+K+F 自动排版
调试 选中变量→右键→快速监视
选中变量 Ctrl+Alt+Q
for循环:用于已知循环次数的循环
for(变量; 变量 逻辑运算符 已知值; 自增或自减)
{循环体;}
执行过程:1、计算表达式1;计算表达式2(循环条件),如果表达式为true,执行循环体,执行表达式3;否则循环结束;
break:跳出当前所在的循环
continue:退出本次循环
三目运算符
Bool?true:false
第一个表达式为真,执行第二个表达式,否则执行第三个表达式(表达式二和表达式三的类型一定要相同或兼容)
goto语句
Label:
goto label
枚举
enum Gender {男,女,未定义}
枚举的定义一般和类定义在同一级别
枚举实质是一个继承自System.Enum的sealed类,枚举中的枚举项是一个valuetype类型的常量可通过IL看到(Literal类型)。
如果第一个枚举项(变量)赋了值,则后面一次递增加1
枚举的作用:1、限制用户不能随意赋值,只能用定义枚举时定义的值;2、 不需要死记每一个值,只需要选择相应的值
枚举中的枚举项可以转换为int值 (int)sex
字符串转换为枚举
sex = (Gender)(Enum.Parse(typeof(Gender), input)); //类似于反射语法
Enum.IsDefined(typeof(BuyType),2);//判断枚举项在枚举中是否存在
Enum.IsDefined(typeof(BuyType),”男”);//判断枚举项在枚举中是否存在
结构:
用于定义多个人(物)的多个信息(变量)时
[访问修饰符] struct structName{变量,方法}
计算机中的用的最多的255,即2的8次方减一,十六进制是FF
数组
可以帮我们声明多个同类型的变量,这些变量在内存中是连续存储的
声明数组: 数组类型[] 数组名=new 数组类型[数组长度] {数组的值,数组的值…};
数组下标赋值: 数组名[访问的数组的索引]
数组的长度:数组名.Length
堆栈:左边声在栈里声明一个空间,右边在堆里声明了“数组名.Length”个空间,并把堆里声明的第一个空间赋值给左边(栈里声明的空间)。
多维数组与交错数组
方法
用来进行代码重用,封装的实现
[访问修饰符] [static] 返回值类型 方法名([参数])
{
方法体;
}
注:1、方法必须放在类中
2、方法名后必须加“()”,即使没有参数
方法的调用
静态方法:类名.方法名();
非静态方法:类实例.方法名();
Return为方法返回值,同时可以退出当前方法
变量的作用域
在方法中定义的变量从定义开始,到定义所在的大括号结束,不能在被调用的方法使用
常量在非静态方法和静态方法中都可以访问。
参数
方法名后面的括号内定义的变量
调用和被调用的参数的类型必须相同
返回值
方法的 返回值类型不能为void
有返回值的方法必须用变量来接收
返回值的类型必须相同
方法可以返回多个返回值,如:返回一个数组。
方法的重载
参数类型、参数个数、参数位置不同、可构成重载;返回值不同构不成重载。
传入参数传出参数(out ref)
Out参数:在方法中必须赋值,在方法外不赋值;在方法的参数中用out修饰,在调用时也要用out修饰;out参数在方法中使用时,必须在使用前赋值。
Ref:引用传递参数,侧重于在方法中修改参数,在传入方法前必须赋值。
不同点:
Out用于传出参数,通常在方法要返回多个值时使用,
ref用于修改传入参数的值,然后传出参数
可变参数
Params 规定可变参数在一个方法的参数中只能有一个,而且只能是最后一个参数。
当有多个方法的参数列表中,先出现参数的类型和后面可变参数类型一样的时候,用户调用该方法,会调用参数最多的一个。方法调用时,参数可以用多个类型和方法体相同的数据。
三层结构
DatasSet实现三层
三层:表示层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
三层结构中各层的依赖顺序,表示层依赖业务逻辑层,业务逻辑层依赖数据访问层。
OOP实现三层
三层:表示层、业务逻辑层、数据访问层、实体类(Models)
三层结构中各层的依赖顺序,表示层依赖业务逻辑层,业务逻辑层依赖数据访问层,表示层与业务逻辑层与数据访问层都依赖实体类
注:在我们编写好的实体类前面一定要加上序列化属性[Serializable],目的是为了提高数据传输中的性能与安全性。
VSTS
Visual Studio Team Architect(设计)
Visual Studio Team Develop(开发)
Visual Studio Team Test(测试)
Wince:windows的单片机操作系统
录屏软件 Camtasia Recorder