首页 > 代码库 > 深入.NET平台和C#编程
深入.NET平台和C#编程
Dictionary<string, Book> bic = new Dictionary<string, Book>(); Book b1 = new Book(); b1.Name = "小明"; b1.Score = 10; Book b2 = new Book(); b2.Name = "夏红"; b2.Score = 100; bic.Add("1",b1); bic.Add("2", b2); foreach (KeyValuePair<string,Book> item in bic) { Console.WriteLine(item.Key+"\t"+item.Value.Name); } Console.ReadKey();
第一章深入.NET框架
序列化
反序列化
内存
交互
八个项目
IO流
XML
泛型
面向对象
继承多态
解析.NET的两个主要组件是什么
CRL(公共语言运行时)和FCL(.NET框架类库)
封装的概念
体现一:私有字段封装成共有属性
体现二:将一堆方法写到一个类中
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别.
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。是为实现各式各样的数据传送,将被传送的数据结构映射进另一种数据结构的处理方式。
.net战略:任何一个人,在任何地方,使用任何终端设备都能访问微软提供的服务
框架组成FCL(framework class library) CLR(commom langage runtiome)
CLR的两部分
CLS(公共语言规范)Common Lannguage Spedfic
CTS(通用语言类型系统)Common type System
ADO..NET
四大类
SqlConnection
SqlCommand
SqlDataReader
SqlDatadapter
DataSet
核心的类库及命名空间
使用泛型 System.Collection.Generic
对文件的基本的操作 System.IO
对网络协议进行编程 System.Net
对数据库的访问 System.Data
开发Windows应用程序 System.WindowsForms
对GDI+基本图形的操作 Sysyem.Drawing
命名空间:保存的是一批功能相似的类的集合
Using System.IO
封装
字段和属性
自动属性
快捷键prop
public int age {get; set;};
反编译工具
//自动属性会在底层生成匹配的私有字段
//当有条件限制时,不可以使用自动属性替换常规属性
--------------------------------------------------------------------------------------------------------------------------------
第二章深入C#数据类型
二进制补充
构造体
构造函数
封装
值类型和引用类型
对象数组
拆箱和封箱
字符串的不可改变性
关于强转Console please
1.
二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,逢2进1,其权的大小顺序为2²、2¹、2º、
、
。对于有n位整数,m位小数的二进制数据用加权系数展开式表示
2.
构造体
关键字struct
1.构造体不可以用new 就是直接对其属性赋值
2.构造体重可以有字段,属性和方法
3.构造体是值类型,类是引用类型
4.在构造体中不能给字段赋值,但是类可以
5.构造体中没有默认构造函数,但是类中有默认构造函数
3.构造函数
无参构造 代参构造
public class Dog{
public Dog(){
}
public Dog(int num){
}
}
4.封装
类封装 字段封装
体现一: 把方法和属性封装到类中 看成是一种封装
体现二:将私有字段封装成共有的属性
优点
代码重用
不必关心具体的实现
面向对象的三大特征之一
public int name { get; set; }
5.值类型和引用类型
关键字
rel引用关键字
先上图
值类型
引用类型
一些概念
1.如果方法参数是值类型,没有ref.方法内对变量值得修改,在MIan中不会保留
2.如果方法参数是值类型,有ref.方法内对变量值得修改,在MIan中会保留
3.如果方法参数是引用类型,无论有没有ref.方法内对变量值的修改在Mian中都会保留
6.对象数组
四类八种
第一类:整形 byte short int long
第二类:浮点型 float double
第三类:逻辑型.boolean
第四类:字符串型 char
自定义类型也是数据类型
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { Peole p = new Peole(); p.Name = "小黄"; Peole[] ps = new Peole[3]; ps[0] = p; } }}
7.拆箱和封箱
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { int num = 5;//值类型 //装箱 装换引用类型 Object obj = num; //拆箱 int result = (int)obj; //不能互换,结论ExecuteScalar() Object Convert.ToInt32(); } }}
8.字符串的不可改变性
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { string str = "今天天气怎样"; Change(str); Console.WriteLine(str); } private static void Change(string str) { str += "今天天气不错"; } //加上ref也能改变 }}
------------------------------------------------------------------------------------------------------------
第三章使用集合组织相关数据
1.System.Collection都所属于空间下
2.List--->ArrayList
3.Map--->Hasptable
4.泛型---->
5.DictionnaryEntry--->结构
6.KeyValuePair<TKey,TValue>---->是一个泛型结构
7.父类向子类强制转换行--->List list=(List)Object;
8.集合增删改
--------------------------------------------------------
(1)卸载项目和删除项目区和移除项目区别 在项目下新建文件夹方便管理
(2)什么是集合 ?将一堆数据类型相同的数据放入一个容器内,该容器就是集合
什么是数组 ?内存中开辟的一连串的空间
int[] num=new int[2]
add()
非泛型集合 单列:ArrayList 双列:HashTable
(3)集合初始化器
ArrayList list=new ArrayList(){new SE(){Name="小明",Age=10},new SE(){Name="小红",Age=10}}
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CASE3{ class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); list.Add("小明"); list.Add("小明"); list.Add(1); //修改数据 list[2] = "小红"; //因为Add方法的参数是Object类型,所以可以添加任何类型的数据 foreach (string item in list) { //里氏替换原则 Console.WriteLine(item); } //删除集合中的元素 list.Remove("小红");//按对象删除 list.RemoveAt(1);//按索引删除 list.Clear();//全部清除 Console.ReadKey(); } }}
//单列:ArrayList //Add(Object):可以添加任何类型的数据 //引发的问题:当我们遍历时,除非将单个元素的类型写成Object //Remove(真实的元素本身Object) //--根据索引删除RemoveAt(int index); //--特性:集合中的元素被删除后,索引会自动维护
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CASE3{ class Program { static void Main(string[] args) { #region ArrayList //ArrayList list = new ArrayList(); //list.Add("小明"); //list.Add("小明"); //list.Add(1); ////修改数据 //list[2] = "小红"; ////因为Add方法的参数是Object类型,所以可以添加任何类型的数据 //foreach (string item in list) //{ // //里氏替换原则 // Console.WriteLine(item); //} ////删除集合中的元素 //list.Remove("小红");//按对象删除 //list.RemoveAt(1);//按索引删除 //list.Clear();//全部清除 //Console.ReadKey(); #endregion #region HashTable //Hashtable table = new Hashtable(); //Student stu = new Student(); //stu.Name = "小明"; //stu.Age = 10; //table.Add(stu.Name,stu); ////只能按key去删除一项 而不能通过下标删除 //table.Remove(stu.Name); ////方案一:通过Key遍历 //foreach (Object key in table.Keys) //{ // //Student st = (Student)item; // //Console.WriteLine(item); // Console.WriteLine("Key是"+key); // Student st = (Student)table[key]; // Console.WriteLine(st.Age); //} ////方案二: //foreach (Student stu1 in table.Values) //{ // Console.WriteLine(stu1.Name); //} ////方案三 key和value看成一个整体 面向的就是table //foreach (DictionaryEntry item in table) //{ // Console.WriteLine(item.Key+""+((Student)item.Value).Name); //} ////点右键快速监视 查看数据类型的方法 ////修改数据 //foreach (string key in table) //{ // if (key.Equals("小红")) // { // //修改年龄 // Student s = (Student)table[key]; // s.Age = 1000; // break; // } //} ////迭代变量不能改变 只能改变其值 因为改的是迭代变量item的值 ////而不是和数组相关的某个下标对应的值 //Console.ReadKey(); #endregion #region 集合自动扩容 //ArrayList list = new ArrayList(); //Console.WriteLine("集合中的容量"+list.Capacity);//容量 //Console.WriteLine("集合中元素的个数"+list.Count); ////1.如果集合中元素的个数为0,并没有开辟空间 ////2.默认如果集合中出现了第一个元素,那么集合的大小4,如果放入第5个元素 ////那么扩容成8 --->+3 ////3.如果在小括号中首次定义的时候指定了集合的长度 ////那么以后扩容的方式变成初次制定数字大小的2倍; ////如果没有指定长度,那么遵循更规范 //Console.ReadKey(); #endregion #region 三元表达式 int a = 2 == 2 ? 1 : 2; #endregion #region 集合初始化器 //ArrayList list = new ArrayList() {"1","2" }; //ArrayList list2 = new ArrayList() { new Student() {Name="小明",Age=10 }, new Student() { Name = "小行", Age = 10 } }; //Student stu = new Student() {Name="小红",Age=10}; #endregion #region 泛型单列集合 ////启动调试F5 开始执行(不调式)Ctrl+F5 一个是最新的文件 一个是上一个文件 //List<string> list = new List<string>(); //list.Add("小行"); //foreach (string item in list) //{ // //一个item代表一个集合 // Console.WriteLine(item); //} ////删除 集合中的元素 //foreach (string item in list) //{ // if (list.Contains("小红"))//包含 // { // list.Clear(); // Console.WriteLine("有"); // } // else // { // Console.WriteLine("没有"); // } //} #endregion #region 泛型双列集合 Dictionary<string, Student> dic = new Dictionary<string, Student>(); Student stu = new Student() {Name="小红",Age=10 }; dic.Add(stu.Name,stu); //快速监视查找数据类型--->设置断点-->启动-->选中item-->点右键-->快速监视-->打开窗口找数据类型 foreach (KeyValuePair<string,Student> item in dic) { Console.WriteLine(item.Key); Console.WriteLine(item.Value.Name); } #endregion } }}
------------------------------------------------------------------------------------------------------------------------------------
第四章深入类的方法
复习,项目(员工打卡),知识点
学习方法 点-线-面-体
1.四种集合,两个泛型,两个非泛型
2.集体的方法
ArrayList单列集合,泛型的List<T>
HashTable和Dictionary<K,V>双列
3.各自的方法
遍历方法,可以使用foreach()
操作掌控:
Add():添加元素
RemoeAt(int index):按索引删除
Clear();清楚集合中所有的元素
Couunt;集合中元素的个数
Capacity:集合容量
双列的属性和方法
XXX.keys:获取元素Key的集合
Count:统计集合中元素的个数
Add():清除所有元素
Add(k,v);Object 作为Key,Object作为value
Remove(Object key)根据key一处单个条目
Containskey(Object key)看某个key值是否在集合中
ContainsValue(Object value)
4.判别值传递还是引用传递
有没有ref
5.结构体考擦
和类的区别
1.结构体不能用new
2.结构体和枚举是值类型,类是引用类型
3.结构体没有默认构造,程序员也不能手动添加构造 而类可以
4.结构体不能给成员变量赋初值
6.装箱和拆箱
值类型转换成引用类型(装箱)
EG.int num=3;
Object obj=num;
7.构造
方法名和类名相同 又没有返回值类型,甚至连void 都不能有
主要用来初始化成员变量
8.面向对象的强化
9.对象交互简单案例
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CASE{ public class dianshi { public bool isStrat = false; //打开的方法 public void open() { if (isStrat==false) { Console.WriteLine("电视以打开"); isStrat = true; } } //调平的方法 public void yuong() { if (isStrat==true) { Console.WriteLine("电视以调平"); } } //关闭的方法 public void close() { if (isStrat) { Console.WriteLine("电视以关闭"); } } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CASE{ public class yaokongqi { //关联绑定电视的状态交互 //打开 public void open(dianshi a) { a.open(); } //挑台 public void tiaotio(dianshi a) { a.yuong(); } //关闭 public void close(dianshi a) { a.close(); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CASE{ public class Program { public static void Main(string[] args) { //买电视 dianshi a = new dianshi(); //买遥控器 yaokongqi b = new yaokongqi(); //一系列的遥控器和电视之间的交互 b.open(a); b.tiaotio(a); b.close(a); Console.ReadKey(); } }}
10.反省回顾
List<T>:占位符
List<String> list=new List<String();
与数组的却别
动态扩容
移除集合中元素时,索引自动维护
Dictionary<K,V> dic=xxx;
dic.Add(建,值);
1.语法报错,运行时语法报错
2.会把第一个覆盖带哦
HashSet<string> set=new HashSet<string>();
--------------------------------------------------------------------------------------------------------------------------------------------
XML文件
1.会编写XML文件
要素:1.区分到小写
2.有开始就必须有闭合
<price/>自闭和
3.一个xml我你当只有一个根节点
4.xml侧重于数据存储,html侧重于数据显示
2.会读取XML文件额元素
XMlDocument doc=new () 整个文档对象 innerXml:""
load("路径"); : innerXML: "整篇文档的字符串";
XmlNoe root=doc.DocumentElement:属性,获取根节点
返回值:XmlElement 继成XMlLinkedNode 继承XmlNode
一般开发,XmlNode
forech(XmlNode item in root .ChildNodes){
}
3.会使用TreeView创建动态树状菜单(TV TreeNode)关系
在TreeView中,每一个节点都对应一个treeNode类型
xx.Text当前节点对应文本
如果无法进入控件的点击事件就找到控件的click或AftrSelect把事件后面的事件名称删掉
TreeNode
//获取选中的节点方式
TreeNode selectNode=tvList.SelectedNode;
selectNode.Text
select.Tag
select.level:当前节点在整棵树中的深度,从0开始
select.Nodes:所有子节点的集合
核心事件:After_Select事件
public void After_Select(Object sender ,EventArgs e){
}
事件和方法
4.部分类:partial 被partial修饰的类被被劈成了>=N部分,但是底层编译器在编译时会合成一个类
网络电视精灵
----------------------------------------------------------------------------------------------------------------------
第六章出事继承和多态
关键字 base ,is a ,:,
虚方法(抽象方法)和java里面的关键子不一样
1.继承注意事项
构造方法不能被继承
子类可以继承父类私有成员但是不能访问
可以(显示/隐士)的调用父类的方法 或变量
调用子类构造的时候,没有使用base关键字调用父类的指定的构造默认调用父类的无参构造
设置点断点查看执行顺序
base.父类方法
base.父类变量
base 父类成员
base()父类构造
public class Preson{ public Preson() { } public Preson(string name,ing age) { this.Name=name; this.Age=age; }}public class Student:Preson{ public Student() { } //调用父类的构造 public Student(string name,int age):base(name,age) { //this.Name=name; //this.Age=age; this.Sex=sex; }}
base(参数1,参数2)顺序是根据父类构造的参数顺序保持一致
但是变量名是和子类构造的参数变量名一致的。
继承的两大特性
单根性 一个子类只能有一个直接父类
传递性 A是B的父亲 B是C的父亲 C和A是什么关系? C可以继承A
new 子类底层原理1.走到子类构造,不进入构造体2.转向父类,进入父类构造体执行3.转向子类构造,执行子类构造体4.转到Main ,内存中构建出子类对象
多态案例
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 联系{ public class Person { public virtual void SayHello() { Console.WriteLine("你好"); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 联系{ public class Chinses:Person { public override void SayHello() { Console.WriteLine("中国人你好"); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 联系{ public class Use:Person { public override void SayHello() { Console.WriteLine("美国人Hello"); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 联系{ class Program { static void Main(string[] args) { List<Person> list = new List<Person>(); Chinses chn = new Chinses(); Use use = new Use(); list.Add(chn); list.Add(use); foreach (Person person in list) { //方式一 //person.SayHello(); //方式二 if (person is Chinses) { Person a = person as Chinses; a.SayHello(); } if (person is Use) { Person b = person as Use; b.SayHello(); } } Console.ReadKey(); } }}
虚方法可以被new 只能修饰方法 本质可以理解为是拓展了基类
抽象方法不可以被new
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 联系{ public abstract class Animal { public Animal() { } //public virtual string name = string.Empty; public abstract void Run(); //虚方法 public virtual void Jump() { Console.WriteLine("跑啊 "); } //重写虚方法 //public override void Jump() //{ //} }}
-----------------------------------------------------------------------------------------------------------------------
第七章深入理解多态
1.多态:不同的对象对同一个操作做出的响应不同,就是多态
2.实现多态: 接口,虚方法,抽象方法,抽象类
3.
is 做类型的判定父类对象 is 子类对象List<Person> list=xxx;foreach(Person item in list){ if(item is Student) { Student stu=item as Student }}实现多态public class Parsen{ //特性 :虚方法的出现墓地就是为了让子类重写 public virtual Eat(){}} public class Child:Person { public override void Eat(){} } 里氏替换原则:在一个软件中,如果子类替换了父类出现的位置,而对整个软件功能没有影响
抽象的定义 虚方法可以选择则性的被子类重写,抽象方法必须让子类重写 1.抽象类不能实例化 2.抽象方法不能有方法体,甚至连{}都不能有 3.抽象方法只能存在于抽象类中 4.一个类被abstract修饰,就是抽象类 5.抽象方法存在的目的,就是为了约束子类中方法存在的形式(参数列表返回值) 6.抽象类不能是静态类(static)或密封类(sealed) 7.抽象类中的抽象方法必须被子类重写,除非子类是一个抽象类 8.抽象方法快捷生成建 Ctrl+.(无输入法) Shift+Ait+F1
------------------------------------------------------------------------------------------------------------
第四章博客知识点复习
List<T>
Dictionary<K,V> 遍历的时候,只能使用foreach
Dictionary<string,Student> dic=new Dictionary<string,Student>();
dic.add("张三",stu1);
dic.add("李四",stu2);
//1种
foreach(string item in dic.Keys)
{
Student stu=dic[item];
}
//3种
foreach(Student item in dic.Values)
{
//一个item就是一个学生对象
}
foreach(KeyValuePair<string,Student> item in dic)
{
//item=key+Value
item.Key
item.Value
}
//数据绑定 List<UserInfo> list
dgvList.DataSource=new BindingList<UserInfo>(list);
--------------------------------------------------------------
Dictionary<string,Student> dic=new Dictionary<string,Student>();
BindingSource bs=new BindingSource();
bs.DataSource=dic.Values;
dgvList.DataSource=bs;
2.泛型扩容原理
1.时机:Add(Object obj)
2.ArrayList:
一个数组:_items
一个元素个数变量: _size
if(_size==this._items.Length)
{
EnsourCapacity(_size+1);
}
EnsourCapacity(int min)
{
int num=this.items.Length==0?4:this.items.Length*2;
this.Capacity=num;
}
结论:集合底层是通过两个数组相互copy实现的。
扩容的本质就是将新数组长度扩容成旧数组长度的2倍,其实上就是调度Array.Copy(oldArray,0,destArray,0,length)。
3.方法重载和构造
方法名和类名相同,作用用来初始化成员变量。
没有返回值类型,void都不能有。
方法重载:
方法名称相同
参数列表不同
和返回值无关
4.方法重载
可变参数
C#
public void say(params object[] objs)
{
//BaseDao Object... objs
}
public static int ExecuteNonQuery(string cmdTxt, params SqlParameter[] parames)
{
return ExecuteNonQuery(cmdTxt, CommandType.Text, parames);
}
Java
/**
* 执行查询操作 目的:返回一个读取器
* @param sql sql语句
* @param objs 参数列表
* @return 读取器对象
* @throws Exception
*/
public ResultSet executeQuery(String sql,Object... objs) throws Exception{
con=getConnection();
ps = con.prepareStatement(sql);
for (int i = 0; i < objs.length; i++) {
ps.setObject(i+1, objs[i]);
}
rs= ps.executeQuery();
return rs;
}
Console.WriteLine();
5.对象间的交互
消息队列:微信关注一个公众号,老罗/罗振宇:罗胖:罗辑思维:
字字珠玑:醍醐灌顶
UML(Uniform Model Language)统一建模语言:
分析和设计 工具
StarUML:
ftp://ftp.accp.com/public/yuanyuming/
类图
用例图
序列图/时序图
大家缺少两种能力:企业需求:
1.自我学习
2.自制能力 16个小时
不怕牛人牛X,就怕牛人比你还努力
公交卡:徘徊于牛A与牛C之间的人
--------------
1.查文档的能力
2.综合运用的能力
IBM DB2<====================>Oracle(Java JDK7.0/) Rational Rose
1自动扩容
通过Add()方法的添加方发底层两个数组相互copy
2.非泛型便利
1.
List<t> list=new List<t>; Dictionary<string,int> dic=new Dictionary<string,int>(); foreach (string item in dic.Keys) { int a=dic[item]; } foreach(KeyValuePair<string,int> item in dic) { //item.Key //item.Value }
3.绑定数据源
1.datagrive.DataSourcr=new BindingList<SE>(list);
2.
Dictionary<string,Student> dic=new Dictionary<string,Student>();
BindingSource bs=new BindingSource();
bs.DataSource=dic.Values;
dgvList.DataSource=bs;
4.重载
Console.WriteList(string name,params object[] objs)
public void say(Objet...obj){}
1.组件图
2.部署图
3用列图用例(Use Case)
用例就是外部可见的系统功能,对系统提供的服务进行描述。用椭圆表示。
4.活动图
实心圆为起始状态,同心圆为结束状态
它是UML中用于对系统动态活动建模的图形,反映系统中一个活动到另一个活动的流程,常常用于描述业务过程和并行处理过程。活动图中包括泳道、活动开始、活动结束、活动、对象、分支、消息等图形符号。
C#类里面模仿Message === throw new Exception("除数不能为0");
父类强转成子类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace D_001{ class Program { static void Main(string[] args) { List<Animal> list = new List<Animal>() { new Cat(), new Dog() }; foreach (Animal item in list) { if (item is Cat) { // Cat ca = (Cat)item; Cat cat = item as Cat; //Console.WriteLine(((Cat)item).name); Console.WriteLine(cat.Age+"."+cat.name); } if (item is Dog) { Dog dog = item as Dog; Console.WriteLine(dog.Age + "." + dog.Color); } } Console.ReadKey(); } }}
深入.NET平台和C#编程