你的位置:首页 > ASP.net教程

[ASP.net教程]个人总结深入.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;

}

泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。 
    很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
非泛型集合类泛型集合类
ArrayListList<T>
HashTableDIctionary<T>
QueueQueue<T>
StackStack<T>
SortedListSortedList<T>

 单列泛型集合:
List<Object> list=new List<Oibject>();
遍历
for(int i=0;i<list.Count;i++)
{
  Console.WriteLine(list[i]);
}
foreach(Object item in list)
{
  Console.WriteLine(item);
}
双列泛型集合
Dictionary<object,object> dic=new Dictionary<object,object>();
遍历
foreach(KeyValuePair<object,object> item in dic)
{
Console.WriteLine(dic.Key);
Console.WriteLine(dic.Value);
}
foreach(Object item in dic.Keys)
{
 Console.WriteLine(item);
  Console.WriteLine(dic[item].Value);
}
foreach(Object item in dic.Values)
{
 Console.WriteLine(item);
}
四.深入类的方法
1.构造函数
(1.)方法名与类名相同
(2.)没有返回值
(3.)主要完成对象初始化工作
2.无参构造函数的
语法
访问修饰符 类名()
{
 //方法体

3.带参构造函数
语法
访问修饰符 类名(参数列表)
{
 //方法体

隐式构造函数
系统自动给类分配一个无参构造函数。
构造函数的重载
无参构造和带参构造可以看成是方法重载。
方法重载
(1.)方法名相同
(2.)方法参数类型不同或者参数个数不同
(3.)在同一个类中
对象交互
每个类都有自己的特性和功能,我们把它们封装为属性和方法。对象之间通过属性和方法进行交互。可以认为方法的参数及方法的返回值都是对象间相互传递消息。
个人理解,他为什么叫对象间交互呢。因为是对象间进行的属性方法交互。而类之间进行的继承多态接口。
 六.初识继承和多态
继承概述
1.什么是继承
(1)移除类的冗余代码
(2)集成的概念
2.base关键字和protected修饰符
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) ;}}

  


3.子类构造函数
(1)隐式调用父类构造函数
(2)显示调用父类构造函数
 继承的使用
继承、封装和多态是面向对象编程的重要特性。
其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。
派生类隐式获得基类的除构造函数和析构函数以外的所有成员。
派生类只能有一个直接基类,所以C#并不支持多重继承,但一个基类可以有多个直接派生类。
继承是可以传递的。

私有成员其实已经被继承了,但是它们却不可以被访问,因为私有成员只能被声明它们的类或结构体中才可访问,所以看上去像是没有被继承。

 如果基类中是没有参数的构造函数

如果基类中是没有参数的构造函数,在派生类中可以自定义有参数的构造函数
如果基类定义了带有参数的构造函数,那么此构造函数必须被执行,且在派生类中实现该构造函数,此时我们可以使用base关键字
 
如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造,
并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。

is a的应用
由于SE和PM都继承Employee,即SE is a Employee,PM is a Employee.
继承的价值:
(1.)集成模拟了现实世界关系,oop中强调一切皆对象,这符合我们面向对象编程的思考方式
(2.)继承实现了代码复用
(3.)集成使程序结构更清晰
多态
解决集成带来的问题
虚方法
使用virtual关键字修饰的方法,称为虚方法。虚方法有方法体
语法
访问修饰符 virtual 返回类型 方法名()
 {
    //方法体
 }
重写虚方法
访问修饰符 override 返回值类型 方法名()
{
//方法体
}
什么是多态
多态按字面的意思就是“多种形态”,指同一操作作用不同的对象时,可以有不同的解释,产生不同的结果。
实现多态
(1.)实现方法重写
(2.)定义父类变量
七.深入理解多态

里氏替换原则

在一个软件系统中,子类可以替换父类出现的位置,而对软件的功能没有任何影响,就称为里氏替换原则。

子类可以扩展父类的功能,但不能改变父类原有的功能。 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。

当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

看上去很不可思议,因为我们会发现在自己编程中常常会违反里氏替换原则,程序照样跑的好好的。所以大家都会产生这样的疑问,假如我非要不遵循里氏替换原则会有什么后果?

后果就是:你写的代码出问题的几率将会大大增加。

例如: Father son=new Son();

C#中有两个关键字可以提现里氏替换原则:is和as操作符 is操作符用于检查对象和指定的类型是否兼容。 as操作符主要用于两个对象之间的类型转换。

父类类型做参数

示例: 先给几个类: 1.父类,交通工具类。有一堆属性。 2.汽车类,继承父类。 3.地铁类,继承父类。 4.员工类。员工乘坐交通工具回家!员工回家的方法,参数是父类对象!

然后建一个员工的集合,初始化员工. 扔到集合里。就和=可以用集合的项点出员工回家的方法传一个子类! 总结这就是子类指向父类!也就是所谓的里氏替换原则!

抽象类和抽象方法

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法

抽象类与非抽象类的主要区别:

·抽象类不能直接被实例化

·抽象类中可以包含抽象成员,但非抽象类中不可以

·抽象类不能是密封的或者静态的

抽象方法是一个没有实现的方法,通过在定义方法时增加关键字abstract可以声明抽象方法。

抽象方法语法

访问修饰符 abstract 返回值类型 方法名();

注意:抽象方法没有闭合的大括号,而是直接跟了个“;”也就是说,它没有包括方法执行逻辑的方法体!

抽象类的定义

语法: 访问修饰符 abstract class 类名{}

注意: 抽象类提供的抽象方法,这些方法只有定义,如何实现都由抽象类的非抽象子类完成。


抽象类和抽象方法的应用

如何实现一个抽象父类派生的子类 当从一个抽象父类派生一个抽象子类时,子类将继承父类的所有特征,包括它未实现的抽象方法。抽象方法必须在子类中实现,除非他的子类也是抽象类。

抽象类和抽象方法的应用

如何实现一个抽象父类派生的子类 当从一个抽象父类派生一个抽象子类时,子类将继承父类的所有特征,包括它未实现的抽象方法。抽象方法必须在子类中实现,除非他的子类也是抽象类。

面对对象的三大特性

封装:保证对象自身数据的完整性和安全性

继承:建立类之间的关系上,实现代码复用,方便系统的扩展。

多态:相同的方法调用可实现不同的实现方式。

八.可扩展标记性语言

一、

操作

解析

public static void Main(string[] args)

{  

   

    doc.Load("Engineer.

     

      foreach(

      {

           switch(node.Name)

            {

                case "id":

                  Console.WriteLine(node.InnerText);

                   break;

            }

      }

}


 用TreeView显示数据

  九.文件操作

如何读写文件

引入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("删除成功");    }  }}

  

 

启动后就是这样可以读出自己硬盘上的东西!

好了就写到这了。总结到这里了。


 



韩国旅游网韩国特价旅游韩国旅游时间韩国旅游跟团现在去韩国旅游多少钱海南欢乐节举办几天?海南欢乐节几号到几号? 2015南京圣诞节去哪玩?_2015南京圣诞节好去处推荐 畅游武安古武当山 兔屎茶“解酒?各国闻所未闻的奇葩解酒法(全文) 67450 海南欢乐节去玩吗?第15届海南欢乐节优惠景点有哪些? 67451 海南欢乐节有什么好玩的?第十五届海南欢乐节节目介绍? 67452 “新世界7大奇观城市”出炉 黎巴嫩首都居首(全文) 67453 看奇幻魔界 听野人传说 67454 2015南京冰雪奇缘圣诞主题展举办时间、地点、门票以及活动详情怎么样? 67455 海南欢乐节有什么活动?2015海南欢乐节活动介绍? 67456 禁止使用硬币购物?世界八国最奇葩规定(全文) 6745 国庆七天乐 相约在星湖 澳门有哪些美食 冰岛旅游花费及注意事项 国庆长假去西藏洗涤心灵吧 恐怖旅游景点推荐 盘点13处恐怖旅游地(胆小慎入) 盘点中国三大死海 不只是国外才有死海 夏天去哪里旅游凉快 中国夏天哪里凉快 夏天哪里旅游好 盘点全球最美的25个人间仙境(图) 韩国著名国立公园推荐 世界十处濒临消失的美景,必须马上出发 四川峨眉山红叶,满山彩林入仙境 新加坡旅游注意事项 TLRME17TP(F) Datasheet TLRME17TP(F) Datasheet TLRME17TP(T) Datasheet TLRME17TP(T) Datasheet TLRME20CP Datasheet TLRME20CP Datasheet 天津周边旅游景点大全 天津周边旅游景点大全 天津周边旅游景点大全 天津周边一日游 天津周边一日游 天津周边一日游 爱琴海在哪里 爱琴海在哪里 爱琴海在哪里