第一章:深入.NET框架

1..NET FrameWork两大组件是什么?

解析:.NET 框架类库(FCL:FrameWork Class Library)和公共语言运行时(CLR:common language Runtime)

2.CLR包含两部分:

解析:公共语言规范CLS(Common Language Specific) 通用类型系统CTS(Common  Type System)

3.c#语言要编程成可以被CPU解析执行的代码需要两次编译:

第一次编译:将C#语言通过c#编译器编译成MSIL中间代码

第二次编译:将MSIL代码通过即时编译器(JIT)编译成CPU可以解析执行的代码,或者成为(平台专用代码)

4.java程序要想被CPU解析执行也是需要两次编译

一次编译:将后缀名为java的文件通过java编译器编译成后缀名为.class(字节码)文件

第二次编译:将.class文件通过java虚拟机(jvm)编译成CPU可以解析的代码

5.CLR里面至少三部分:

CTS

CLS

JIT

类库:可以看成是一个承载了N个类的容器。

类库:System.Data.SqlClient    和数据库交互

System.Data:            DataSet

System.WinForms;        Winform应用必须类库

System.Collections.Generic;   泛型集合

System.Net;                网络操作,下载等操作

System.IO;               文件的读写,文件夹的读写。遍历等操作

System.Drawing;           绘制图形,和验证码

类库和命名空间?

解析:一个类库一般对应一个命名空间,也可以对应多个。

6.字段和属性区别?

解析:01.属性不能保存数据,真正保存数据的是字段

02.属性是可有可无的,字段是必须的。

03.如果字段只想让类内部访问,那么设置成private,如果想找一个中间者,

在Main方法中访问到Student类中的私有字段,那么属性可以是一种选择。

希望:推荐大家以后书写类的时候,字段和属性成对出现。

.属性无非就是有get和set两个访问器组成

第二章:深入C#数据类型

1.值类型和引用类型

值类型:int double string bool 枚举 浮点型

引用类型:System.Object string 自定义类 接口 数组

值类型(在栈上存储真实的值)和引用类型(堆和栈上都要分配空间)

2.关于数组的那些事儿

如果我们定义一个数组,并且赋值了

int[] nums={1,2};

nums当中保存 的是堆中的地址:例如:0x001

nums[0]:访问的是堆中的内容

3.封装的优点

第一:重用;

第二:不必关心具体的实现; (方法)

第三:面向对象三大特征之一;

第四,具有安全性!

4.结构体

1.结构体不用new,就可以直接对其属性赋值

2.结构体中可以有字段,属性和方法

3.结构体是值类型,类是引用类型

4.在结构体中不能给字段赋初值,但是类中可以

5.结构体中没有默认构造函数,但类中有默认构造函数

所有数据类型的父亲都是Object

所有的值类型直接的父亲是ValueType,爷爷是Object

5.构造函数

默认如果定义了一个类,系统会自动的生成一个和该类名称相同,并且没有返回值类型,

甚至连Void都没有的方法,该方法就称为构造函数

Student stu=new Student();

注意问题:值类型的直接父类都是ValueType,而ValueType又继承自Object

特殊的值类型:枚举和结构体

特殊的引用类型:数组和接口

6.拆箱和装箱

拆箱:

装箱:

7.值类型传递和引用类型传递

方法的参数是值类型和引用类型

注意:值传递和引用传递判定依据是有没有ref关键字

结论:

1.如果方法的参数类型本身就是引用类型,那么对参数值的修改会永久保存

例如:public void TP(SE se)

{

se.Count++;//真正的修改se对象的Count值

}

02.如果方法的参数类型本身是值类型,又没有ref修饰,那么对参数值的修改,不会永久保存()

03.如果方法的参数类型本身是值类型,但是有ref修饰,那么对象参数值的修改,也会永久保存。

值类型传递 :不带ref的参数传递   SE se

引用类型传递:带ref的参数传递

第三章 使用集合组织相关数据

一、集合概念引入

集合:某些指定的对象(SE)集中在一起就是集合

数组:可以存储相同数据类型的一堆数据的容器

二、第一个集合ArrayList的使用

★1.引子:

用ArrayList进行赋值的时候,需要使用Add()

但是对集合中元素的修正可以使用下标,eg.list[0]=1给新值

但是在集合中元素个数为0的情况下,不能用Add()方法之外的其他手段给集合中添加元素

,原因因为_size是集合的一个属性, 真正存储元素个数为0的时候。_Size也是0.

int[] nums = { 1, 2, 3, 3, 4, 5 };

我想在2和3之间插入一个元素100

数组的局限性:由于给数组中添加元素,删除元素的时候,特别麻烦,所以我想找一个替代数组的工具,来帮我们实现数组所能实现的功能。集合应运而生

集合的优点:01.自动扩容 02.集合当中很多方法可以让我们更加便捷的来操作集合中数据。(必须掌握)

扩展:集合本质的讲解▲

00.使用ArrayList首先需要引入命名空间

01集合动态扩容原理:如果集合中元素个数为0,并没有开辟空间

02.默认如果集合中出现了第一个元素,那么集合的大小4,如果放入第5个元素,那么会扩容成8

03.如果在小括号中首次定义的时候指定了集合的长度,那么以后扩容的方式

变成初次指定数字大小的2倍;如果没有指定长度,那么遵循01的规范

三、集合中元素操作(添加,遍历,删除、常见错误)

1.常见属性:

Capacity:集合占用空间

Count:集合存储元素个数

2.常用方法:

添加:int Add(Object value) //添加一个对象到集合的末尾

遍历:通过foreach遍历

删除:Remove()、RemoveAt()和Clear()

*:注意事项:如果删除了集合中的某一个元素,那么集合的索引会自动维护

Remove():删除内容

RemoveAt():通过索引删除

Clear():一次性移除集合中所有的元素

Contains():是否包含某个元素

3.ArrayList

删除方法,包含,

02.命名空间

同名类便于区分,加快检索硬盘上某个类的速度

Using System.Collections

Using System.Collections.Generic; //泛型命名,默认导入

03.var :隐式类型推断

最后一个问题:

int num=5;

04.HashTable

第一个:删除

没有RemoveAt()

第二个:

三个方案:根据key拿到value

只能拿到value

DictionayEntry

Foreach( DictionayEntry item in table)

{

item.Value

//命名空间.类名

}

第三个:HashTable是一种无序的双列集合。

第四个:ContainsKey()

01.集合对于数组优点:

001.操作方便(新增,删除,查找方便)

002.自动扩容(刚开始可以不指定集合初始容量)

02.集合的实现原理

解析:集合在设计上还是使用数组实现的,只不过微软对两个相互copy的数组的执行效率进行了优化,所谓的自动扩容,无非是将新数组长度定义成旧数组长度的两倍后,再将新数组的前N项用旧数组的所有项填充而已。

4.集合初始化器,对象初始化器

ArrayList engineers = new ArrayList()

{

new SE(){Name = "周星星",Age = 26,

Gender = Gender.male,ID = "000",Popularity = 10},

new SE(){Name = "王贱贱",Age = 22,

Gender = Gender.female,ID = "111",Popularity = 20},

new SE(){Name = "周姐姐",Age = 30,

Gender = Gender.male,ID = "222",Popularity = 20}

};

5.HashTable

Hashtable 通常称为哈希表

根据键(Key)可以查找到相应的值 (Value)

1.HashTable注意事项

01.HashTable类型的集合只能用foreach循环遍历,因为没有索引

02.HashTable集合中元素是无序的(不会按照Add的顺序来展示元素内容)

03.HashTable中的key不能重复

04HashTabel没有RemoveAt()

2.对HashTable遍历三种方案:

1.:第一种方式,遍历所有的keys,通过key的值获取value

2.:第二种方式:遍历所有的value集合

3.:第三种方式,同时遍历key和value

Eg:

foreach (DictionaryEntry item in table)

{

Console.WriteLine(item.Key + "value==" + item.Value);

6.泛型集合List<T>(理解difficult,写起来easy)

泛型:就是为了约束ArrayList中元素类型,而制定的一个新的集合类型,该类型只能加入同一类型的多个元素,标识符<T>,可以看成是一个占位符,泛型是将运行时错误提前到了编译时

7.泛型集合Dictionary<K,V>

Dictionary<string,Person> dic=new Dictionary<string, Person>();

8..NET集合框架(集合扩展)

Queue(队列):

Queue与Stack类似,主要区别是Queue类以先进先出(FIFO)的结构创建集合,即,元素进入集合的顺序与弹出顺序相同

队列图:

一、void Enqueue(object obj):将元素加入队列

二、object Dequeue():将队首元素从队列中删除

三、bool Contains(object obj):判断是否包含某元素

Stack(栈):

Stack:System.Collections.Stack类表示对象的简单的后进先出非泛型集合。

栈图:

常用方法:

泛型方法

//方法定义

static void Swap<T>(ref T lhs, ref T rhs){    T temp;    temp = lhs;    lhs = rhs;    rhs = temp;}

//方法调用

public static void TestSwap(){    int a = 1;    int b = 2;     Swap<int>(ref a, ref b);    System.Console.WriteLine(a + " " + b);}

第四章 深入类的方法.构造函数

构造:方法名和类名相同,没有返回值

无参构造函数

带参构造函数

构造的生成:

注意:在C#中,当我们定义了一个类后,默认会生成一个与类名

同名的无参构造,但是如果我们自定义了任何一个带参构造,那么

系统不再帮助我们生成无参构造,在真实的开发中,推荐大家定义

两个构造函数,一个无参,一个带参。

2.方法重载

解析:在同一个类中,如果多个方法方法名称相同,但是参数列表(个数,顺序,类型)不同)的多个方法可以构成重载,和方法的返回值类型没有半毛钱关系

以下的两个方法可以构成方法重载

public void Say(string name,int age)
        {
           
        }
        
        public void Say(int age,string name)
        {
           
        }

第六章 继承

使用new实例化对象调用了构造函数

方法重载的特点:

在同一个类中,方法名相同该,参数里列表不同,和返回值类型无关

1.继承:在C#中,如果一个类后面通过冒号又跟了另外一个类,那么我们就称冒号前面的类

为子类,冒号后面的类为父类。这种书写类的方式放映出来的关系就称为类的继承关系。

子类:派生类

父类:基类或者超类

2.如果new一个子类对象,那么有如下执行流程

01.先定位到子类对应构造函数,没有执行子类的方法体

02.转向了父类的无参构造函数,执行父类构造方法体

03.转向了子类的方法体继续执行。

3.通过base调用父类构造函数注意点

解析:01.通过base调用父类构造函数只能书写在子类的构造后

02.通过base调用父类构造函数参数顺序和父类的构造参数一致

4.访问修饰符

public:在任何位置都可以访问,甚至是跨程序集都可以访问。

private:只能当前类的花括号中访问。

protected:只能在当前类,当前类的子类,子类的子类(孙子类)中可以访问。

5.继承的传递性

如果一个类B继承自类A,而类C又继承类B,那么类C也可以访问到类A中非私有成员

6.new子类底层原理

1.走到子类构造,不进入构造体.

2.转向父类,进入父类构造执行.

3.转向子类构造,执行子类的构造体

4.转到Main内存构建对象.

5.遍历窗体上所有的控件,判断是不是文本框

foreach(Control c in this.Controls)

{

if(c is TextBox)

{

((TextBox)c).Text="";

}

}

6.继承的价值

01.模拟现实世界的关系

02.便于重用和扩展已彻底测试的代码,且无需修改

03.结构更清晰

14.实现多态三种方式:

方式一:通过虚方法实现多态

实现多态的步骤

01.在父类中通过virtual关键字定义一个虚方法

02.在子类中通过override关键字对父类中的虚方法进行重写

03.调用的时候,调用的是子类的方法

目前为止,我们学了两种:

第一种:虚方法实现多态

通过在普通类Person中用Virtual关键字定义虚方法SayHello(),然后在子类Student中通过override关键字对父类的SayHello()方法进行重写。

如下:

Studnt类

Teacher类

在Main方法中调用

第七章 深入理解多态

1.里氏替换原则:在一个软件系统中,如果子类出现在父类出现的位置,而整个软件功能又没有影响,那么咱们称为里氏替换。

考试题:父类变量指向子类对象!!

2.里氏替换  是     设计原则的一种

七种设计原则   ,写成blogs。

3.Is 和as

Is 做类型判定,  要想进行父类对象    到子类  类型的转换,还得用 as

4.模拟员工回家-------->父类作为方法参数

Employee

--->GoHome(Traffic traffic)

Traffic  ---父类

--->Bicycle  (自行车)

--->Car

--->Tube

Program

--->Main

5.大话设计模式

简单工厂

单例

23种设计模式

两种方式实现多态:

普通类+  虚方法

抽象类+抽象方法

市面上所有教程 都会明确指出一个观点 :抽象类不能实例化 。

一.实现面向对象的多态性有哪几种方法?

总共有3种,第一种,虚方法实现多态,  第二种:抽象方法实现多态  第三种:接口实现多态

目前为止,我们学了两种:

潜台词:不能直接使用如下代码实例化

Animal  animal=new Animal();//编译器报错

间接的通过子类构造,隐式   调用  父类构造的形态  来变相的在内存中 产生一个你肉眼不可见的对象。但是不幸的是  ,作为程序员的我们,无法拿到抽象类对象的引用(也就是栈上的变量名)。 第一种:虚方法实现多态

通过在普通类Person中用Virtual关键字定义虚方法SayHello(),然后在子类Student中通过override关键字对父类的SayHello()方法进行重写。

如下:

Student类

Teacher类

在Main方法中调用

第二种:抽象方法实现多态

通过在抽象类Birds中定义抽象方法Fly(),然后在子类【燕子】中对抽象方法Fly()进行重写实现多态,重写方式和虚方法一样,也是使用override关键字

Birds类:

燕子类:

喜鹊类:

在Main中调用:

课堂笔记:

//01.定义一个抽象类,用abstract 修饰

//02.抽象方法不能有方法体,甚至连{}都不能有

//03.抽象方法只能存在于抽象类中,但是抽象类中可以有非抽象方法

//04.抽象类不能实例化

//05.抽象类中抽象方法只是用来规定方法的形式(参数,返回值),约束子类方法的形式

//06.抽象类中的抽象成员必须在子类中全部实现,除非子类也是抽象类

//07.子类实现抽象方法的快捷键,Ctrl+.(没有输入法情况下 )

//shift+alt+F10

//08.抽象类不能用static修饰,也不能是密封类(sealed):如果是static,抽象就无法被继承,也就失去了抽象类

02.方法重载和方法重写的区别?

override:在不同的类中,一个方法用override关键字修饰,那么就对父类当中的同名方法进行了重写

重写的目的:就是为了实现多态,更进一步来说,就是为了统一调用

方法重载:overload:在同一个类中,多个方法名称相同,参数列表不同就可以构成重载,和返回值类型

没有半毛钱关系

第八章:可拓展标记语言XML

解析Xml文件

 XmlDocument myXml=new XmlDocument();
myXml.Load("Engineer.xml");//读取指定的XML文档
XnlNode engineer=myXml.DocumentElement;//读取XML的根节点
foreach(XmlNode node in engineer.ChildNodes);//对子节点进行循环
{
//将每个节点的内容显示出来
switch(node.Name)
}

S2总结笔记的更多相关文章

  1. TCPL学习笔记:编写expand(s1, s2),将字符串s1中类似于a-z一类的速记符号在s2中扩充完整。可以处理大小写及字符,以及a-b-c, a-z0-9以及-a-z等多种情况。

    话不多说,看代码: #include <stdio.h> #include <stdlib.h> int main(void) { ] = "a-z0-9hahah- ...

  2. 预习笔记 多态 --S2 4.3

    第三章 多态 polymorphism 多态 instance 例子override 重载 constructor 构造器ClassCastException 类型转换异常upcasting 上抛 d ...

  3. 挑子学习笔记:BIRCH层次聚类

    转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/6129425.html 本文是“挑子”在学习BIRCH算法过程中的笔记摘录,文中不乏一些个人理解,不当之处望 ...

  4. Java基础知识笔记(八:集合类)

    目录 1  集合类简介  2  List介绍及简单使用 2.1  LinkedList介绍及简单使用 2.2  ArrayList介绍及简单使用 2.3  Vector介绍及简单使用 2.3.1  S ...

  5. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...

  6. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  7. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  8. 《JavaScript高级程序设计》笔记整理

    欢迎各位指导与讨论 : ) -------------------------待续------------------------------- 本文为笔者在学习时整理的笔记,如有错漏,恳请各位指出, ...

  9. GDI+ 笔记

    1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...

随机推荐

  1. zookeeper入门讲解事例

    zookeeper使用和原理探究(一) zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<Th ...

  2. Android 采用post方式提交数据到服务器

    接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ...

  3. WPF学习之路(十四)样式和模板

    样式 实例: <Window.Resources> <Style x:Key="BtnStyle"> <Setter Property=" ...

  4. Asp.Net Web Form 前后台传值

    1,后台往前台传值----单个变量直接传递到页面元素 前台代码 <b><%=strCompanyName%>费用明细</b> 后台代码 public partial ...

  5. Sql Server之旅——第十二站 sqltext的参数化处理

    说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无比强大的系统,我们平时做系统的时候都会加上缓存,我想如果没有缓存,就不会有什么 大网站能跑的起来,而且大公司一般会在一个东西上做的比较用心 ...

  6. Javascript刷新页面的几种方法

    Javascript刷新页面的几种方法: window.navigate(location)location.reload()location=locationlocation.assign(loca ...

  7. 烂泥:rsync与inotify集成实现数据实时同步更新

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要 ...

  8. LeetCode #329. Longest Increasing Path in a Matrix

    题目 Given an integer matrix, find the length of the longest increasing path. From each cell, you can ...

  9. 用VC6开发嵌入式LINUX程序

    黄山松 (Tom Huang) 发表于博客园http://www.cnblogs.com/tomview/ 首先说明一下,VC6自然不能直接开发LINUX程序,主要使用的是它的编辑环境而已,但是作为一 ...

  10. php遍历循环数组实现方法

    简单利用foreach for list each while来遍历数组,包括普通的一维数组与二维数组遍历方法,下面详细的介绍了每个函数的使用方法. $foreach = array(1,2,3); ...