C#入门经典学习阶段小结(凌乱)

CLR: common language runtime(.net 公共语言运行库)管理.net库开发的所有应用程序的执行

CTS: common type system (通用类型系统)指定最基本类型有助于使用.NET Framework的各种语言之间进行交互操作
CIL:common intermediate language (通用中间语言) 编译代码为该语言,CIL代码独立于计算机、os、cpu的,由JIT编译器使用创建所需的本机代码
JIT: just in time (CIL代码仅在需要时才编译)
托管代码:将代码编译为CIL,存储在程序集中,再用JIT编译器将它编译为本机所需代码,还需要管理正在执行的用.NET Framework编写的代码。

创建.NET应用程序所需步骤:
->使用C#编写应用程序代码
->把代码编译为CIL,存储在程序集中
->执行代码时,必须使用JIT编译器将代码编译为本机代码
->在托管的CLR环境下运行本机代码

重置vs c#development settings设置:错误 1: 为“CoffeeScript”[代码 5297] 导入设置时出错。

转义序列 例如用\“来转义“双引号,用\n是换行符的转义序列
字符串插入:如输出Console.WriteLine($"{outline}");
运算符优先级:++,--用作前缀,(),+,-一元时,!,~
*,/,%
+,-
<<,>>
<,>,<=,>=
==,!=
&
^
|
&&
||
=,*=,/=,%=,+=,-=,<<=,>>=,&=,^=,|=
++,--用作后缀

C#的分支技术:三元运算符,if语句,switch语句
switch语句在C++中可以运行完一个case语句后运行另一个case,但在C#中这样做是非法的,每个case语句需要一个break中断switch执行
另外可以使用return语句,不仅中断switch结构,还中断当前函数的执行;还可以用goto语句
三种循环:do循环,while循环,for循环
循环的中断命令:break,continue,return

使用checked设置溢出检查上下文

枚举:枚举值转换为其他类型,需要显式转换

用replace("str1","str2"),替换函数,用str2替换字符串中所有的str1
.Trim()命令,删除空格,可以添加char数组定义删除字符,测试代码时发现trim()出现问题,反而trim(mycahr),[]mychar={' '}

引用传递参数 ref关键字,改变调用的参数值,必须使用初始化之后的‘非常量const’的变量。
或者使用输出参数 out关键字,可以使用未赋值的变量,函数使用out时必须将其看作尚未赋值。
static关键字定义全局变量,const定义全局常量

函数的签名包含函数的名称及其参数,不包含其返回类型
委托:一种存储函数引用的类型,不带函数体,使用delegate关键字,委托声明指定了一个返回类型和一个参数列表

类:理解为车规划图纸,对象:理解为汽车本身。
类决定了对象将要拥有的属性和行为。
class progrem
{ //可以写字段、函数、属性、构造函数。。
//字段:存储数据 属性:保护字段 get set (对自动属性进行保护的时候需要实例化) 函数:描述对象的行为 构造函数:初始化对象,给对象的每个属性进行赋值
}

传智播客 基础加强1:
oop:
封装:
--->减少了大量的冗余代码
--->封装将一坨很难理解的功能封装起来,但是对外提供了一个很简单的使用接口。我们会使用就OK。
继承:
--->减少了类中的冗余代码
--->让类与类产生了关系,为多态打下了基础。
特性:
单根性:一个子类只能有一个父类
传递性:爷爷类 爹类 儿子类
里氏转换:
1、子类可以赋值给父类
2、如果父类中装的是子类对象,则可以将这个父类转换为对应的子类对象
---->关键字
1、is:返回bool类型,指示是否可以做这个转换
2、as:如果转换成功,则返回对象,否则返回null
作用:我们可以将所有的子类都当做是父类来看,针对父类进行编程,写出通用的代码,适应需求的不断改变。
多态:
--->虚方法
virtual override
--->抽象类
abstract override
--->接口
interface

关键字
new
1、创建对象
--->在堆中开辟空间(对象是引用类型,引用类型的值都在堆里)
--->在开辟的堆空间中创建对象
--->调用对象的构造函数
2、隐藏父类的成员 (当子类的函数名和父类一样时)
this
1、代表当前类的对象
2、显示的调用自己的构造函数
base
1、显示调用父类的构造函数(并不是父类的对象)
2、调用父类的成员

静态构造函数只能在以下情况下执行:
*创建包含静态构造函数的类实例时
*访问包含静态构造函数的类的静态成员时

string和object是简单的引用类型,数组是隐式的引用类型,创建的每个类都是引用类型
编译器不允许派生类的可访问性高于基类。
接口的指定必须放在基类继承之后,用逗号隔开。
接口没有关键字abstract和sealed(它们不包含实现代码,不能直接实例化,且必须是可以继承)。接口不是类,所以没有继承System.Object

system.Object包含的方法:
Equals() bool
ReferenceEquals() bool:比较传送给它的两个对象,是不是同一个实例的引用
ToString() String:返回对应于对象实例的字符串
MemberwiseClone() object:创建一个新对象实例并复制成员,以复制该对象
GetType() System.Type:返回对象类型(typeof运算符:可以把类名转换为System.Type对象)
GetHashCode() int:返回一个以压缩形式表示对象状态的值

构造函数初始化器,它把代码放在方法定义的冒号后面。例如可在派生类的构造函数定义中指定所使用的基类构造函数。
用base()关键字指定.NET实例化过程使用基类中具有指定参数的构造函数

定义不能创建的类:将其定义为静态类,或者将其所有的构造函数定义为私有。
不能创建的类可通过它们拥有的静态成员来使用。

对于ArrayList集合,使用对象的Add()方法添加新项;

yield 迭代

封箱是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。拆箱则相反。
作用:它允许在项的类型是object的集合中使用值类型,其次,有一个内部机制允许在值类型上调用object方法。

is运算符: is 注意如果是一个值类型,而也是该类型,或者可以拆箱到该类型里,则为true。

不能重载赋值运算符,例如+=,也不能重载&&和||

IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象:提供CompareTo(),int,接受一个对象
IComparer在一个单独的类中实现,可以比较任意两个对象:提供Compare(),int,接受两个对象
类Comparer提供了ICompare接口的默认实现方式:Comparer.Default.Compare(one,two)。CaseInsensitiveComparer类:不区分大小写

声明可空类型: int? nullableInt; int?是System.Nullable的缩写,更便于读取

空合并运算符??与空条件运算符?.可以在结果是null时候设置一个默认值:
int? count=customer.order?.Count() ?? 0;
另外,空条件运算符的另一个用途是触发事件。

协变、抗变:
泛型类型参数定义为协变,加out关键字,反之,抗变用in关键字

传智播客:
1、导入命名空间
命名空间就是类的"文件夹"。类就是"文件夹"中的文件。需要导入命名空间
添加引用:
如果我需要在一个项目中,访问另一个项目中的某一个类
--->添加对另一个项目的引用
--->导入命名空间

2、静态和非静态
静态成员:被static修饰
实例成员:不被static修饰
静态成员先于实例成员被加载到内存中,只有创建了对象,才有实例成员。
静态类中只能存在静态成员
调用:
静态成员调用:
类名.静态成员名;
实例成员调用:
实例名.实例成员;(实例就是我们的对象)
什么时候使用静态?
---->作为工具类,比如所有的扩展方法!都需要static
---->在整个项目中资源共享,正因为它是资源共享的,所以静态成员必须要等到整个项目都结束的时候
才会被资源释放。
在我们的项目中应该尽可能的少使用静态成员。
继承是创建对象的过程。
3、设计模式
---->单例设计模式
在整个程序中,我们要保证对象必须是唯一的。
实现:
---->第一步:构造函数私有化
---->第二步:声明一个静态字段,作为全局唯一的单例对象
---->第三步:声明一个静态函数,返回全局唯一的对象
示例:
//第一步:构造函数私有化
private Form2()
{
InitializeComponent();
}

//第二部:声明一个静态的字段用来存储全局唯一的窗体对象
private static Form2 _single = null;
//第三步:通过一个静态函数返回一个全局唯一的对象
public static Form2 GetSingle()
{
if (_single == null)
{
_single = new Form2();
}
return _single;
}
---->简单工厂设计模式
核心:把所有的子类都当做父类来看待
练习:
提示用户分别的输入两个数字:
再输入运算符:返回一个计算的父类,并调用方法得到结果。
Add Sub Cheng Chu
建筑行业最早应用到设计模式这个概念
1、注册一个公司

2、招兵买马
3、投标买地
4、安排施工队开始施工
5、卖楼
设计模式就是用来专门解决一些特定的问题。
4、类库
.dll文件,我们使用类库来帮助我们封装一些常用的功能
5、值类型和引用类型
值类型:int double char bool decimal struct enum
引用类型:string 数组 自定义类 接口 委托
值类型的值存储在内存的栈上,引用类型的值存储在堆中。
栈上存储数据的效率要高于堆。

值传递:把值类型作为参数传递,把值本身进行传递。
注意:
ref可以把值传递改变为引用传递。
引用传递:把引用类型的值作为参数传递,传递的是引用。

6、字符串的学习
重要特性:
不可变性,我们不管对字符串做什么操作,都会在内存中产生一块新的实例。
驻留池
我们可以将一个字符串看作是char类型的只读数组。
GC:Garbage Collection垃圾回收 ,每隔一段时间,会扫描整个内存,发现,如果有的空间没有被指向。则立即把它销毁。

1.说明字符串的不可变性2.字符串常量的“暂存池”特性。

String 字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。
属性
Length //获得字符串中字符的个数。”aA我你他”→5
方法
IsNullOrEmpty() 静态方法,判断为null或者为”” (静态方法)
ToCharArray() 将string转换为char[]
ToLower() 小写,必须接收返回值。(因为:字符串的不可变);
ToUpper() 大写。
Equals() 比较两个字符串(地址/对象的状态,而==是比较对象引用)是否相同。忽略大小写的比较,StringComparation.
//对于string类型而言,不管是等号还是Equals比较的都是值本身。
//Equals默认比较的是地址,但是我们在自己定义的类中如果用到Equals,都会将Equals进行重写,使之按照我们自己的需求进行比较
IndexOf() 如果没有找到对应的数据,返回-1.//面试题:统计一个字符串中,”天安门”出现的次数。
LastIndexOf() 如果没有找到对应的数据,返回-1
Substring() //2个重载,截取字符串。
Split() //分割字符串。
Join() 静态方法
Replace()

对象初始化器:采用非默认的构造函数/不必添加额外代码,为每个属性使用键值对提供其值。
合并对象、集合初始化器(适合于LINQ技术一起使用)(编译器为在集合初始化器中提供的每一项调用集合的Add()方法)

var关键字,隐式推理变量类型,可以是int、string、数组(数字值从来都不会被解释为可空类型,除非是定义new int?[ ] )等等
如果要在数据存储对象中修改属性的值,就不能使用匿名类型(因为被定义为只读属性)

dynamic关键字,动态变量类型,

可选参数,没有默认值的参数不能放在有默认值参数的后面。

命名参数,参数顺序任意并且可选。但如果混合使用命名参数和位置参数,就必须包含所有的位置参数,其后是命名参数。

Lambda表达式:是一个委托,赋给一个委托类型的变量;解释为表达式树
表现: 括号中的参数列表=>C#语句/{多行代码+如果还不是void的委托,需要加return}
LINQ框架包含一个泛型类,可用于封装Lambda表达式,使用该类的一种方式是提取用C#编写的Lambda表达式,将它转换为相应的SQL脚本

扩展方法Aggregate(),表示把一个累加器函数应用于集合中从开始到结束的每对元素上。

传智播客 基础加强3:
1、StringBuilder:进行大量字符串操作的时候的工具。String对象是不可变的。
将StringBuilder转换为String用ToString();
仅仅是拼接字符串的工具,大多还会转换为String
*StringBuilder sb=new StringBuilder();
*sb.Append();//追加字符串
*sb.ToString();//ToString("x2"),表示转换为16进制,并且是两位的。
*sb.Insert();
*sb.Replace();
使用程序拼接html中的table:WPF中没有窗体应用程序的DocumentText,只能使用webBrow.NavigateToString(sb.ToString());
2、out:out参数侧重于在函数中返回多个值;参数要求必须在方法的内部为其赋值
3、ref参数:ref参数侧重于将一个值带澳函数中进行改变,再讲改变后的值带出去。ref参数在函数内不用赋值,函数外必须为ref参数赋值
4、
5、集合的学习:
非泛型集合:
ArrayList
Hashtable
泛型集合:
List:相对于数组,不用确定初始范围
Capcity:集合中可以包含的元素的个数(初始值为4,每次翻倍)
Count:获取集合中实际包含的元素的个数
Add():添加单个元素
AddRange():添加一个集合
Insert():插入一个元素
InsertRange():插入一个集合
Remove():移除指定的元素
RemoveAll():里面是lambda表达式,例如list.RemoveAll(n => n > 3)凡是大于3的数据全部删除
RemoveAt():根据下标移除元素
RemoveRange():移除一定范围内的元素
ToArray():集合转换成数组
ToList():数组转换成集合

Dictionary
6、装箱和拆箱:
装箱:值类型--->引用类型
拆箱:引用类型--->值类型
我们判断是否发生了拆箱或者装箱,首先要判断这两种数据类型是否存在继承关系。
装箱的时候用什么类型装的箱,拆的时候就拿什么类型拆。
7、编码格式:
将字符串是怎样的形式保存为二进制。
ascii 256
6000 GB2312
GBK GB18030

ISO
Unicode
utf-16
utf-8
出现乱码的原因:我们保存这个文件的时候采取的编码跟打开这个文件的时候采取的编码格式不一致。
文本文件:拖到txt中还能看得懂得就是文本文件。
.txt .html .ini .xml
File的基本操作:操作文件
Exist():判断指定的文件是否存在
Create():创建
Move():剪切
Copy():复制
Delete():删除
ReadAllLines() ReadAllText()默认采用的编码格式是utf-8
Directory:操作的是文件夹
CreateDirectory:创建一个新的文件夹
Delete:删除
Move:剪切
Exist()判断指定的文件夹是否存在
GetFiles()获得指定目录下所有文件的全路径
Directory.GetFiles(@"E:\download", "*.avi")获得所有的.avi文件
GetDirectories()获得指定目录下所有的文件夹
只能获得当前第一目录下所有的文件夹
正则表达式 主要类:Regex
就是一个模板,我们可以使用这个模板,去一坨字符串中找到我们想要的数据。
注意:正则表达式是操作字符串的。
组成:
限定符,元字符,常用的表达式
判断是否匹配:Regex.IsMatch("字符串","正则表达式");
字符串提取:Regex.Match("字符串","要提取的字符串的正则表达式");
(循环提取所有):Regex.Matches()
字符串替换:Regex.Replace("字符串","正则","替换内容");
.+? 匹配大量字符
(?<名字> ) 可以给括号匹配部分起名
贪婪模式:
"1111。11。11。11111。"
贪婪: .+。 尽可能多的匹配
非贪婪: .+?。尽可能的少匹配,1个

样式:批量设置要应用到控件上的某些属性
模板:在其基础上设置控件外观的控件
触发器:
要定义Tigger对象监视的属性,应使用Trigger.Property属性
要定义何时激活Trigger对象,应设置Trigger.Value属性
要定义Trigger触发的操作,应将Trigger.Setters属性设置为Setter对象的一个集合
动画:通过故事板创建,storyboard对象包含在资源字典中,必须通过x:Key属性来识别

不含关键帧的时间线:DoubleAnimation、PointAnimation和ColorAnimation

依赖属性:输入propdp+两下Tab键,即可插入属性模板

XML:可扩展的标记语言
与HTML的区别:XML中的元素必须关闭!XML中元素的属性必须用引号
语法规范:标签(Tag)、嵌套(Nest)、属性。
标签(即元素Element)要闭合,属性值要用“”包围,标签可以互相嵌套。
在XML中是节点(Node)包含元素(Element)。
大小写敏感
创建XML:DOM文档对象模型
XmlDocument doc=new XMLDocument();
XmlElement order = doc.DocumentElement;//根节点
使用XPath查询XML:
XmlNode xn = order.SelectSingleNode("/Order/Items/OrderItem[@Name='雨衣']");
根节点不允许删除,即doc.RemoveAll();不可以
但是order.RemoveAll();可以,移除根节点下的所有子节点
删除子节点:ITems.RemoveChild(xn);
删除某节点的属性值:xn.Attributes.RemoveNamedItem("Count");

ctrl+K和S/X,快捷键插入代码段/外侧代码,比如#region

委托delegate:使用委托把一个函数作为参数传递
函数可以直接赋值给一个委托对象 委托的签名必须跟函数的签名一样(即返回值和参数类型一致)
DelSayHi del = SayHiChinese;//new DelSayHi(SayHiChinese);
对比: 委托是不安全的,
事件本身是一个安全的委托

定义事件:
public delegate void delTest(); //注册事件时需要一个委托
public event delTest eventTest; //不要小括号
注册事件:
eventTest += new delTest(method1);
eventTest += new delTest(method2);
总结:
委托的作用:
占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值和参数列表要确定)
事件的作用:
事件的作用与委托变量一样,只是功能上比委托变量有更多限制。
比如:一、只能通过+=或-=来绑定方法,二、只能在类内部调用(触发)事件。

程序集的好处:
程序中只引用必须的程序集,减少程序的尺寸;
程序集可以封装一些代码,只提供必要的访问接口。


第16章:
云:只是运行在一个数据中心的大量商品化的计算机硬件,这个数据中心可以运行程序,存储大量数据。
具有弹性,即动态向上扩展的能力(例如增加内存和CPU)和/或动态向外扩展的能力(增加虚拟服务器实例的数量)
云服务模式:
1、基础设施即服务(IaaS):要从操作系统开始向上负责。
2、平台即服务(PaaS):值负责运行在所选操作系统上的程序及其依赖项。
3、软件即服务(SaaS):通过互联网访问的设备上使用的一个软件程序或服务。

相关推荐:

c#教程】C# 数据类型

通过静态局部变量看C,C++,C#,Java,PHP的特点

以上就是C#入门经典学习阶段小结(凌乱)的详细内容,更多请关注其它相关文章!