前言:学习C#编程应该有几个月了,作为一个菜鸟,没有资格来评论什么。只有对自己所学进行一个总结,可能有不严谨的地方,万望谅解。
一·深入.NET框架
.NET框架(.NET Framework),他是开发.NET应用程序的核心基础。
.NET框架的体系结构
支持C#、VB、.NET、c++、等语言的开发,也就是我们所说的跨语言开发。
.NET框架具有两个主要组件:CLR和FCL。(CLR是Common Language Runtime即公共语言进行时;FCL是Framework Class Library即框架类库)
.NET框架核心类库及其功能
类和对象
类定义了一组概念模型,而对象是真实的实体。
set访问器只写;get访问器只读。
在vs中自动属性prop+双击Tab键
封装
1.保证数据的安全性。
2.提供清晰的对外接口
3.类内部可以任意修改,不影响其他类。
类图
二.深入C#数据类型
值类型应用类型
值类型包括基本数据类型,和枚举类型,结构体等。
引用类型包括string 数组,类和接口。
结构体:
可以有字段,可以有方法。
定义时字段不能被赋初值。
不用new。声明结构对象后必须给结构成员赋初值。
拆箱和装箱
示例:
int a=1;
object o=i;//装箱
int j=(int)o;//拆箱
值传递和引用传递
引用类型作为参数时:
1、在修改变量本身时,结果类似于值传递,即不会改变传递前的变量的值
2、在修改变量的属性或字段时,才是引用传递,会影响到传递前的变量的值
3、参数使用了ref后,才是真正的引用传递,不管修改变量本身还是修改变量的属性或字段,都会影响到传递前的变量的值
值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递的对象的栈中对象的拷贝。)
引用传递:传的是栈中对象的地址。(即函数内参数对象与调用时传递的对象完全是同一栈中对象。)
三.使用集合组织相关数据
System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); Console.WriteLine("遍历方法一:"); foreach (int item in list)//不要强制转换 { Console.WriteLine(item);//遍历方法一 } Console.WriteLine("遍历方法二:"); for (int i = 0; i < list.Count; i++)//数组是length { int number = (int)list[i];//一定要强制转换 Console.WriteLine(number);//遍历方法二 } } } }
1、哈希表(Hashtable)简述
在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.
2、哈希表的简单操作
在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);
在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);
从哈希表中移除所有元素: HashtableObject.Clear();
判断哈希表是否包含特定键key: HashtableObject.Contains(key);
遍历
foreach(DictionaryEntry item in Hashtable)
{
item.Key;
item.Values;
}
很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
非泛型集合类 | 泛型集合类 |
ArrayList | List<T> |
HashTable | DIctionary<T> |
Queue | Queue<T> |
Stack | Stack<T> |
SortedList | SortedList<T> |
public class Person { protected string ssn = "111-222-333-444" ; protected string name = "张三" ; public virtual void GetInfo() { Console.WriteLine("姓名: {0}", name) ; Console.WriteLine("编号: {0}", ssn) ; } } class Employee: Person { public string id = "ABC567EFG23267" ; public override void GetInfo() { // 调用基类的GetInfo方法: base.GetInfo(); Console.WriteLine("成员ID: {0}", id) ; } }
其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。
继承是可以传递的。
如果基类中是没有参数的构造函数
并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。
里氏替换原则
在一个软件系统中,子类可以替换父类出现的位置,而对软件的功能没有任何影响,就称为里氏替换原则。
子类可以扩展父类的功能,但不能改变父类原有的功能。 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
看上去很不可思议,因为我们会发现在自己编程中常常会违反里氏替换原则,程序照样跑的好好的。所以大家都会产生这样的疑问,假如我非要不遵循里氏替换原则会有什么后果?
后果就是:你写的代码出问题的几率将会大大增加。
例如: Father son=new Son();
C#中有两个关键字可以提现里氏替换原则:is和as操作符 is操作符用于检查对象和指定的类型是否兼容。 as操作符主要用于两个对象之间的类型转换。
父类类型做参数
示例: 先给几个类: 1.父类,交通工具类。有一堆属性。 2.汽车类,继承父类。 3.地铁类,继承父类。 4.员工类。员工乘坐交通工具回家!员工回家的方法,参数是父类对象!
然后建一个员工的集合,初始化员工. 扔到集合里。就和=可以用集合的项点出员工回家的方法传一个子类! 总结这就是子类指向父类!也就是所谓的里氏替换原则!
抽象类和抽象方法
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法
抽象类与非抽象类的主要区别:
·抽象类不能直接被实例化
·抽象类中可以包含抽象成员,但非抽象类中不可以
·抽象类不能是密封的或者静态的
抽象方法是一个没有实现的方法,通过在定义方法时增加关键字abstract可以声明抽象方法。
抽象方法语法
访问修饰符 abstract 返回值类型 方法名();
注意:抽象方法没有闭合的大括号,而是直接跟了个“;”也就是说,它没有包括方法执行逻辑的方法体!
抽象类的定义
语法: 访问修饰符 abstract class 类名{}
注意: 抽象类提供的抽象方法,这些方法只有定义,如何实现都由抽象类的非抽象子类完成。
抽象类和抽象方法的应用
如何实现一个抽象父类派生的子类 当从一个抽象父类派生一个抽象子类时,子类将继承父类的所有特征,包括它未实现的抽象方法。抽象方法必须在子类中实现,除非他的子类也是抽象类。
抽象类和抽象方法的应用
如何实现一个抽象父类派生的子类 当从一个抽象父类派生一个抽象子类时,子类将继承父类的所有特征,包括它未实现的抽象方法。抽象方法必须在子类中实现,除非他的子类也是抽象类。
面对对象的三大特性
封装:保证对象自身数据的完整性和安全性
继承:建立类之间的关系上,实现代码复用,方便系统的扩展。
多态:相同的方法调用可实现不同的实现方式。
八.可扩展标记性语言XML
一、XML是什么?作用是什么?
l XML ( eXtensible Markup Language )语言是一种可扩展的标记语言。其中的可扩展是相对HTML来说的。因为XML标签没有被预定义,需要用户自行定义标签。
l XML 被设计的宗旨是:是表示数据,而非显示数据。
操作XML的方法
解析XMl文件
public static void Main(string[] args)
{
XmlDocument doc=new XmlDocument():
doc.Load("Engineer.xml");
XmlNode root=new XmlNode();
foreach(XmlNode item in doc.ChildNodes)
{
switch(node.Name)
{
case "id":
Console.WriteLine(node.InnerText);
break;
}
}
}
XmlDocument doc = new XmlDocument(); doc.Load("北京电视台.xml"); XmlNode root = doc.DocumentElement; //找根节点 foreach (XmlNode item in root.ChildNodes)//遍历子节点 { if(item.Name.Equals("tvProgramTable"))//判断条件是节点的Name是否是"tvProgramTable" { foreach (XmlNode items in item.ChildNodes)//遍历子节点的子节点 { TvProgram Tp = new TvProgram(); Tp.PlayTime = Convert.ToDateTime(items["playTime"].InnerText); Tp.Meridien = items["meridien"].InnerText; Tp.Path = items["path"].InnerText; Tp.ProgramName = items["programName"].InnerText; ProgramList1.Add(Tp);//绑定到集合 } } } TreeNode minenode = new TreeNode(); minenode.Text = "我的电视台"; //bind tvList.Nodes.Add(minenode); //根节点 TreeNode root = new TreeNode(); root.Text = "所有电视台"; //bind tvList.Nodes.Add(root); ChannelManager manager = new ChannelManager(); manager.ResolveChannels(); List<ChannelBase> list = manager.List; foreach (ChannelBase item in list) { TreeNode tn = new TreeNode(); tn.Text = item.ChannelName; tn.Tag = item; root.Nodes.Add(tn); }
九.文件操作
如何读写文件
引入using.System.IO;
string path=txtFilePath.Text;
string content=txtContent.Text;
if(path.Equals(null)||path.Equals(""))
{
MessageBox.Show("文件的路径不为空");
return;
}
try
{
FileStream nyfs=new FileStream(path,FileMode.Create)
streamWriter mysw=new StreamWriter(myfs);
mysw.Write(content);
mysw.Close();
myfs.Close();
MessageBox.Show("写入成功");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
文件流
语法
FileStream 文件流对象=new FileStream(string filePath,FileMode fileMode);
文件读写器
StreamWriter 写入器
StreamWriter mysw=new StreamWriter();
解决乱码问题
FileStream myfs=new FileStream(path,FileMode.Open)
StreamReader mySr=new StreamReader(myfs,Encoding.Default);
content=mySr.ReadToEnd();
txtContent.Text=content;
文件和目录操作
File类和Directory类
File类常用的方法
Exites(string path) 用于检查指定文件是否存在
copy()复制文件
Move()移动文件
Delete()删除文件
示例 小型资源管理器
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chap09_资源管理器 { class MyFile { public string FileName { get; set; } public long FileLength { get; set; } public string FileType { get; set; } public string FilePath { get; set; } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Diagnostics; namespace Chap09_资源管理器 { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void FrmMain_Load(object sender, EventArgs e) { DriveInfo[] di = DriveInfo.GetDrives(); foreach (DriveInfo item in di) { TreeNode tn = new TreeNode(item.Name); tn.Tag = item.Name; tvList.Nodes.Add(tn); } } public void BindInfo(TreeNode node) { try { lvList.Items.Clear(); DirectoryInfo dir = new DirectoryInfo(node.Tag.ToString()); DirectoryInfo[] dirs = dir.GetDirectories(); foreach (DirectoryInfo item in dirs) { TreeNode tn = new TreeNode(); tn.Text = item.Name; tn.Tag = item.FullName; node.Nodes.Add(tn); } FileInfo[] fi = dir.GetFiles(); List<MyFile> files = new List<MyFile>(); foreach (FileInfo item in fi) { MyFile mf = new MyFile(); mf.FileName = item.Name; mf.FileLength = item.Length; mf.FileType = item.Extension; mf.FilePath = item.FullName; files.Add(mf); } foreach (MyFile item in files) { ListViewItem items = new ListViewItem(item.FileName); items.SubItems.Add(item.FileLength.ToString()); items.SubItems.Add(item.FileType); items.SubItems.Add(item.FilePath); lvList.Items.Add(items); } } catch (Exception ex) { MessageBox.Show(""+ex.Message); } } private void tvList_AfterSelect(object sender, TreeViewEventArgs e) { TreeNode node = this.tvList.SelectedNode; this.BindInfo(node); } private void lvList_DoubleClick(object sender, EventArgs e) { Process.Start(lvList.SelectedItems[0].SubItems[3].Text); } private void 复制ToolStripMenuItem_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderBrowserDialog(); DialogResult result = fbd.ShowDialog(); string sourcePath = lvList.SelectedItems[0].SubItems[3].Text; string desPath = null; if(result==DialogResult.OK) { desPath = fbd.SelectedPath; desPath += "\" + lvList.SelectedItems[0].SubItems[0].Text; File.Copy(sourcePath,desPath); MessageBox.Show("复制成功"); } } private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) { lvList.Items.Clear(); string deletePath=lvList.SelectedItems[0].SubItems[3].Text; File.Delete(deletePath); MessageBox.Show("删除成功"); } } }
启动后就是这样可以读出自己硬盘上的东西!
好了就写到这了。总结到这里了。