今天在微博上看到一个话题叫精致的程序媛,哈哈,希望自己慢慢也能成为精致的程序媛啦~
努力✊
先贴上我在知乎上找的一个链接:非常有用,快夸我是小天使!
http://www.cnblogs.com/figure9/p/developer-reading-list.html#csharp
最近在学习c#,因为之前也没有接触过,所以在网上搜了一下,这本书适合c#入门,讲的都是比较基础的知识点,
所以准备一边学习,一边记笔记
这篇笔记是看到第一二章后记录和实践的,后续会继续更新笔记
第一章:初实.NET平台
(1)概念:是一个运行库的环境,一个全面的基础类库,支持多种编程语言
(2)三个关键实体:
CLR(公共语言运行库common language runtime)
定位,加载,管理.NET同时负责一些底层的工作(内存管理,应用托管,处理线程,安全检查)
CTS:(公共类型系统common Type system)
描述运行库所支持的所有可能的数据类型和编程结构,指定实体之间如何交互,规定他们在 .Net元数据格式中的表示
CLS:(公共语言规范commonlanguage specification)
让所有的.NET语言都支持的公共类型和编程结构
BCL:
适用于全部.Net程序语言的基础类库,封装各种基本类型,线程,文件输入/输出图形绘制以及各种外部硬件设备的交互,还支持在实际应用中用到的一些服务
C#的核心特点的一部分:
(1)C#支持类型属性和可选参数,允许重载操作符,支持创建结构,枚举,回调函数(委托)我理解的委托相当于函数指针
(2)不需要指针,c#不需要直接对指针进行操作
(3)垃圾收集器能够自动管理内存不支持delete关键字
(4)构建泛型类型和泛型成员的能力:在和泛型项交互时可以定义很多占位符
(5)支持匿名的方法:允许在任何需要委托类型的地方提供内联函数
(6)使用partial关键字可以跨多个代码文件定义单个类型的能力
(7)支持强类型的查询(LINQ),用于和各种形式的数据进行交互
(8)支持匿名类型,允许建模一个类型的形而不是行为
(9)使用拓展方法拓展既有类型(没有子类)功能的能力:没有子类也可以拓展
(10)包含Lambda
操作符(=>)进一步简化委托类型的使用
(11)新的对象初始化语法:允许在创建对象时设置属性的值
(12)支持可选的方法参数和命名的方法参数
(13)支持通过dynamic在动态运行时查找成员
(14)泛型类型:使用协变和逆变,在泛型数据和普通System.Object集合之间进行相互映射
(15)一对关键字(async 和 await),简化多线程和异步编程
.cs文件编译成功之后生成的时CIL,不是与平台相关的指令
看.cs文件编译成功之后会生成哪些文件:
不会直接把源代码编译成特定的指令集而是编译为CIL的好处:语言集成
然后就会将CIL代码编译成特定平台的指令:
CIL在使用之前必须进行即时编译,将CIL代码编译成有意义的CPU指令的工具---》JIT(即时)编译器(会用适合目标操作系统的方式将结果缓存在内存中,下一次调用就不需要编译CIL了)
相关概念:
托管代码:必须在.Net运行库下运行的代码
程序集:包含托管代码的二进制单元
非托管代码:不能直接在.NET运行库承载的代码.NET二进制文件不包含特定于平台的指令,包含的是与平台无关的IL(中间语言)和(类型元数据)
.NET二进制文件:IL(与平台无关,中间语言)MSIL CIL 是一个概念
元数据:描述每一个二进制文件中定义的类型(结构,类,枚举)和每个类型的成员(属性,方法,时间)
清单:用来描述程序集本身的元数据, 程序集本身也会使用元数据进行描述,这些元数据叫清单(记录程序集的当前版本,文 化信息和正确执行所需的外部引用程序集的列表)
生成程序集清单是编译器的工作
重点看这三大类型:
CTS
(1)五种类型
- 类类型
- 接口类型: interface:通过一个给定的类或者结构来实现
接口对类的自身没有什么用,当一个类或者结构实现一个给定接口时,以多态方式通过接口引用来使用提供的功能,C#的接口一般声明成public,其他程序集中的类型就可以实现其行为
结构类型:C#的结构类型可以包含字段,可以包含参数化构造函数,可以定义方法
枚举类型
用来组成名称/值对
枚举类型派生自System.Enum 这个基类定义了一些有趣的成员,允许通过编程提取,操作和变换底层的名称/值对
委托类型(类似于类型安全的C风格的函数指针)
不同之处是:.Net是派生自System.MulticastDelegate的类,不是简单的指向原始内存地址的指针:
通过delegate来声明的
相当于是一个指向返回值为int,两个int参数的函数指针
CTS类型成员:大部分的类型可以含有任意数量的成员
类型成员{构造函数终结器,静态构造函数,嵌套类型,操作符,方法,属性,索引器,字段,只读字段,常量,事件}
CTS建立一套定义明确的核心数据类型
CLS
CLS描述支持.Net的编译器必须支持的最小的和最完全的特征集,以生成可由CLR承载的代码,同时可以被其他语言用统一的方式进行访问
运行库:执行给定编译代码单元所需的外部服务的集合
.NET运行库提供了一个定义明确的运行库层,可以被支持.NET的所有语言和平台共享
过程:Mscorlib.dll自动加载,由它负责将需要的程序集导入内存,引擎的主要任务是:负责解析程序集的位置,读取其中包含的元数据,在二进制文件中发现请求的类型
在内存中为类型分配,将关联的CIL编译成特定的平台,执行所需要的类型安全检查,运行代码
程序集/命名空间/类型的关系命名空间相当于程序集相关类型的一个分组,一个程序集可以包含任意个命名空间,一个命名空间可以包含多种类型,方便从逻辑上理解和组织关联类型的方式
简单介绍完概念,下面就是进入第二章:创建c#程序
1)记事本的方式创建:
创建cs文件c.csc
代码:
using System;
class TestApp
{
static void Main()
{
Console.WriteLine("Hello world");
}
}
用visual studio 命令行工具进入到文件所在的目录下:
修改代码:
using System;
using System.Windows.Forms;
class TestApp
{
static void Main()
{
Console.WriteLine("Hello world");
MessageBox.Show("Hello world!");
}
}
重新编译:编译命令:
结果:
出现窗体
2)如何引用多个外部程序集:
用分号分隔的列表列出各个程序集:
3)如何编译多个源文件:
新建一个cs文件,内容如下:
using System;
using System.Windows.Forms;
class Hello
{
public void Speak()
{
MessageBox.Show("Hello world");
}
}
修改之前的c.cs文件:
using System;
//using System.Windows.Forms;
class TestApp
{
static void Main()
{
Console.WriteLine("Hello");
//MessageBox.Show("Hello world!");
Hello h = new Hello();
h.Speak();
}
}
如下编译,运行:
结果:
4)什么是c#响应文件
C#响应文件包含了在当前程序的编译期间所要用到的所有的指令
文件的拓展名为*.rsp
文件内容:
/r:System.Windows.Forms.dll
/target:exe /out:c.exe *.cs
将rsp文件放在同一目录下:
进行以下命令,执行成功:
可以指定多个rsp文件作为输入
Csc @FirstFile.rsp @SecondFile.rsp @ThirdFile.rsp
但是要记住编译器会根据所遇到的命令选项作相应的处理
在响应文件前的命令行中被显式列出来的标志将被指定的*.rsp文件覆盖:
下面进行演示:新建一个文件3.cs
键入以下内容:
using System;
using System.Windows.Forms;
class Hi
{
public void Speak()
{
MessageBox.Show("Hi");
}
}
运行结果:
如果把/out放在后面,执行结果如下:
虽然名字覆盖掉,但是运行的结果却跟之前一样
标志就会覆盖相应文件里面的设置
接下来主要学习用visualstudio 来创建c#程序
熟悉visualstudio的各个工具:
(1) 如何引用外部程序集
勾选:
删除:
选中按delete键:结果
(2) 查看Project Properties:增强的项目配置编辑器
(3)class view工具:从面向对象的角度显示当前项目里的所有类型
视图==》类视图
(4)
对象浏览器:检查在当前项目中被引用的程序集
视图==》对象浏览器
(5)对既有代码进行重构:
选中重构的代码,右击----》快速操作和重构èExtract Method:修改重构的名称:
(6) 代码拓展和围绕
(7) 可视化的class designer
选中项目=》右击点查看=》查看类图
选中项目而不是解决方案,右击---》查看---》查看类图
(8) 类详细信息:view=>其他窗口=》类详细信息
从工具箱拉出来一个新类,修改名称,添加新的string字段,查看代码:
可以在类图上直接添加字段:查看源代码:源代码也会相应自动修改
新建新类:
在类图中从工具箱中拖出继承的箭头—》右击查看代码
代码自动生成