个人总结深入.NET平台和C#编程
前言:学习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) ;
}
}
其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。
派生类只能有一个直接基类,所以C#并不支持多重继承,但一个基类可以有多个直接派生类。
继承是可以传递的。
如果基类中是没有参数的构造函数
并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。
里氏替换原则
在一个软件系统中,子类可以替换父类出现的位置,而对软件的功能没有任何影响,就称为里氏替换原则。
子类可以扩展父类的功能,但不能改变父类原有的功能。 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
看上去很不可思议,因为我们会发现在自己编程中常常会违反里氏替换原则,程序照样跑的好好的。所以大家都会产生这样的疑问,假如我非要不遵循里氏替换原则会有什么后果?
后果就是:你写的代码出问题的几率将会大大增加。
例如: 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("删除成功");
}
}
}
启动后就是这样可以读出自己硬盘上的东西!
好了就写到这了。总结到这里了。
个人总结深入.NET平台和C#编程的更多相关文章
- S2---深入.NET平台和C#编程的完美总结
1.NET简单解说 l 面向对象提升 OOP(Object Oriented Programming)面向对象编程 AOP:(Aspache Oriented Programming):面向切面编 ...
- 深入.net平台和c#编程 学习笔记
深入.net平台和c#编程 一:理解.nteFramwork与c# 1.1,:Microsoft.net框架概述 1.2:.net框架结构 1.3.:c#语言概述 1.4:体验框架类库的强大功能 二: ...
- 使用ReactiveCocoa实现iOS平台响应式编程
使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Prog ...
- [转]使用ReactiveCocoa实现iOS平台响应式编程
原文:http://www.itiger.me/?p=38 使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍 ...
- 《深入.NET平台和C#编程》内部测试题-笔试试卷答案
1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格式化器的Serialize()和Deseria ...
- 我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作
在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码.JAX-WS的运行时实现会将这些API的调用转换 ...
- ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...
- ROS Learning-028 (提高篇-006 A Mobile Base-04) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(不精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-04 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(不精确的制定目标位置) 我使用的虚拟机软件:VMware Workstation ...
- .NET平台和C#编程的总结
第一章 简单认识.NET框架 (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...
- 深入.NET平台和C#编程总结大全
对于初学者的你,等到你把这个看完之后就更清楚地认知.NET和C#编程了,好了废话不多说,开始吧! ...
随机推荐
- asp.net反向代理
https://www.codeproject.com/Articles/18490/Reverse-Proxy-in-C-NET-v https://www.codeproject.com/Arti ...
- System.InvalidOperationException : 不应有 <Response xmlns=''>。
xml如下: <?xml version="1.0" encoding="UTF-8"?> <Response version="2 ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
- 手机端页面自适应之rem布局
W3C官网上是这样描述rem的--"font size of the root element" . rem布局在移动端发挥的比较好. 阿里团队高清方案: <script&g ...
- Mac下安装ionic和cordova,并生成iOS项目
为了开发HTML5,除了最新使用React Native等之外,目前首选的为稳定的ionic+Angularjs来开发iOS和android. Ionic(ionicframework一款接近原生的H ...
- Xcode查找内存泄漏
- qt5中文代码编码编译问题
qt中文代码用vs2010编译问题解决 总结说就是qt5默认UTF8不支持微软默认的ANSI(GB2312/GBK).解决办法是把中文字符串全部用 QString::fromLocal8Bit() 封 ...
- PL/SQL Developer不配置TNS直接登录
如果只是临时登录,就没必要去配置一个TNS了,Database那里直接输入<IP>:<PORT>/<服务器SERVER_NAME> EBS的直接登录: http:/ ...
- Mac 操作技巧
1.OS X下如何在同一个程序之中快速切换窗口 command+`(1左边的那个) 2.
- 在Web工程中引入Jquery插件报错解决方案
在学习Jquery插件的时候,遇到一个问题就是新建web工程后在WebRoot下引入Jquery插件的时候报错,不知道为什么好纠结,但是项目能正常运行,后来找到解决方案,在这里给大家分享一下. 解决方 ...