首页 > 代码库 > c#基础浅学
c#基础浅学
C# 程序设计
第一章 初识 .NET Framework 和 C#
.NET Framework 是支持生成和运行下一代应用程序和 Web 服务的内部Windows组件
.NET Framework 的关键组件为公共语言运行时(CLR)和 .NET Framework 类库(.dll)
.NET Framework 提供了托管执行环境,简化的开发和部署以及与各种编程语言的集成(跨语言的平台)
.NET Framework 具有两个主要组件:公共汉语言运行时(CLR) .NET Framework 类库(FCL)
CLR 称为公共语言运行时(是管理代码执行并提供简化开发过程的服务的运行环境)(提供了内存管理,线程执行,代码执行,代码安全验证,编译以及其它系统服务)
IL 中间语言
.exe
JLT 即时编译器 (编译成2进制的机器语言)
CLR 是由 CTS(通用类型系统) 和 CLS(公共语言规范) 组成
System.Collections.Generic; 泛型
System.Linq;数据库
System.Text; Builder
静态方法可以直接运行
App.config 应用程序配置文件
命名空间(逻辑组织)(避免命名冲突)
第二章 C# 基础语法
标识符:是程序中类型和变量的名称,标识代码元素名称,由Unicode字符组成(使用未格式化的Unicode字符,以一个合法的Unicode字符或下划线开始,用关键字作标识符,必须以@符号开始(数字不是合法的Unicode字符))
abstract as base bool break byte case catch char checked chass const (常量) continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in in(泛型修饰符) int interface internal(程序集内部) is(类型判断) lock(多线程时候用) long namespace new(隐藏父类的同名方法) null object operator out(类型输出参数) out(泛型修饰符) override(重写) params(可变参数数组,必须放在参数列表的最后一个) private protected(保护的,只有子类可以访问) public readonly ref(引用参数) return sbyte sealed(密封类,不能被继承,修饰方法,子类不能被修改) short sizeof stackal static string struct(结构) switch this throw(抛出异常) true try typeof uint ulong unchecked unsafe ushort using virtual(虚拟的,定义虚方法,可以override) void volatile while
除了参数,私有字段及局部变量使用Camel风格外,其他均使用Pascal风格
Pascal:类,方法名,属性名,类内的共有字段,接口,自定义的数据类型(枚举,结构)
变量:程序运行期间变化的程序元素(变化的元素的容器)
匿名局部变量也是强类型的局部变量(只能在方法内部用)初始化的时候必须是强类型,不能是无类型的
object string(类) 引用类型,其它为值类型
byte 0 – 255
sbyte -128 – 127
decimal (精度高) double(范围大)
\b退格 \r换行 \n回车
TryParse(“”, out )转换失败返回结果为0
Convert.ToSingle()转换为浮点型
C#运算符
优先级顺序
一元运算符(正,负,取反,按位求补,加加,减减,点)
二元运算符(算术,移位,关系,赋值,逻辑、条件)(is:类型判断 前者是不是不后边的类型的,继承的也算 是返回true,否则false;as:转换失败返回空值)
三元运算符
里氏替换原则
用as 转换记得判断转换结果是不是null 不是再去执行后续代码
短路与 && 从前往后依次判断 有false就不执行后面的判断了
短路或 || 有true 后面就不再判断
字符串的不变性
string.Equals(str1, str2); === str1.Equals(str2); === str1 == str2;
str.Split();分隔
DateTime 是结构 是值类型
Array
所有数组都隐式继承自 System.Array 类
Array.Sort();排序
Array.Reverse();反转
数组是引用类型,对数组的修改可以保留下来(值类型操作的是副本)
第三章 面向对象的程序设计及类的概念
对象是人们要进行研究的任何事物,是对问题领域中事物的抽象(万物皆对象,每个对象都是唯一的,对象具有属性和行为,对象具有状态(属性对应的值),对象都属于某个类,每个对象都是某个类的实例(指的对象))(能加上量词的都是对象)
类:是一种具有相同属性和行为的对象的抽象,描述一组相似对象的共性(类是模型,是模板,是图纸)
类和对象之间的关系:1. 我们会从同一种对象身上提取共同拥有的特征、属性和共同能执行的操作、行为转化为类中的数据成员(属性、字段),和方法(行为、操作)。
2. 用类进行实例化,为该实例指定不同的属性,则创建出不同的对象。
3. 类是模板,是图纸,一般不干活,真正干活的是实例,是对象。
4. 使用对象,调用对象的方法,就可以干活了
类和类之间构成了对象模型
对象模型中的类是一种自定义的数据类型
面向对象编程(Object Oriented Programming):定义各个类及它们之间的关系(三大基本特征:封装,继承,多态)
public 公共变量,无法防止任意赋值,数据不安全(解决方法:把变量定义为私有的,然后公开公共的属性来进行访问,可以提高数据的安全性)
privarte 私有字段 加 public 公共属性是对私有字段的封装(属性是关于字段的一对访问方法,一个getter方法,用于获取字段的值,一个setter方法,用于设置字段的值)
继承可以减少冗余代码
面向对象编程相对传统语言来说解决传统语言的数据类型只能定义属性,无法描述行为的问题
[]表示可选的 <>表示必填的
类成员包括:字段、常量、属性、方法、索引器、构造函数、析构函数、内部类
用new 调用构造函数创建对象
计算机中的内存分为两大块
栈内存:速度快,内存小(存对象的引用,指向堆内存的起始地址)
堆内存:速度慢,内存大(存真正的对象(对象的实际数据))
(你必须知道的.net)
const 常量(常量在编译的时候初始化)(只能在定义的时候初始化)
readonly 在运行时初始化(只能定义在方法外部)无法对只读的字段进行赋值,
readonly字段只能在定义的时候(编译的时候)或在构造函数上(运行的时候)初始化
静态方法只能引用静态字段和字段方法
get set 都出现 读写; 只有get 只读; 只有set 只写;
属性本质上是一对方法
方法是类或对象的行为,是对象间传递消息的机制
方法拥有签名,方法的访问级别、可选修饰符、返回值、名称、任何方法参数(签名是方法区别于其他的类成员)
public(任意项目中都可以访问) private(只能在当前类内访问) protected(只能在继承的子类中访问(出现在父类)) internal(只能在当前程序集内访问)
protected internal(可以在当前程序集内访问,也可以在跨程序集的子类中访问)
类如果没有访问修饰符,默认是internal; 类内的成员如果没有访问修饰符,默认是private
在命名空间中定义的元素无法显式地声名 private、protected、protected internal
OO:面向对象
OOP:面向对象编程
OOA:面向对象分析
OOD:面向对象设计
OOAD:面向对象的系统分析与设计
封装(索引器(访问数组成员))
static 不用创建对象可以直接访问 用static修饰的变量或者属性 通过类名来访问 属于类 对所有对象来说 保留同一个父本(版本)
sealed 密封的 用sealed修饰的方法 变量 类 不能被继承(拒绝被继承)(用 sealed修饰一个类 这个类不能再有子类 用sealed修饰的方法 不能被子类重写)
构造函数不能写返回值类型 普通方法必须有返回值类型(没有返回值写void)
形参
方法中的变量必须要初始化赋值
值参数
ref(引用参数) 定义和引用的时候都要写ref 把变量名(地址)传进去 使用前必须要初始化赋值(当某个方法需要修改值类型数据时,ref参数通常是适用的)
out(输出参数)弥补return只能返回一个值的不足 调用方法之前 不需要明确的被赋值,返回之前必须要赋值
ref 侧重修改 out 侧重输出
params(可变参数数组) 必须放在最后
类中的每一个成员都可以分为实例成员(定义在类类内,没有static修饰符修饰的)、静态成员(定义在类内 使用static修饰(静态成员属于类 不属于特定的对象 必须要通过类名去访问)避免了创建实例的开销)两类
静态类的所有成员都必须是静态的
静态方法可以直接访问静态成员 不可以直接访问实例成员(通过对象去访问)
实例方法可以直接访问静态成员
静态成员无需初始化(采用数据类型的默认值)
方法重载(同一类内)同名方法参数列表不同(返回值不是判断重载的标准)
重写:父类中的方法可以被子类进行重写,从而有不同于父类的实现
第一步:把父类中的方法(允许子类重写)用virtual修饰;第二步:在子类中使用ovverride重写从父类中继承的虚方法。
new 隐藏父类的同名方法(有意隐藏)是一种静态绑定机制,由对象定义时决定 定义的是什么类型 就执行定义的类中的方法 看等号左边 左边是定义 右边是实例化(在构建类库时很有用 可以做版本控制)
ovverride 是一种动态绑定机制,由运行时的对象决定,看等号的右边
构造函数 类里面特殊的一种方法 名与类名相同 没有返回值 可以初始化成员变量(this 引用类当前的实例)
this 指向类自身、调用自身
构造函数是用new调用的
所有类型都集成自System.Object
GetType(检查对象的类型(返回Type类型))、ReferenceEquals(比较引用)、Equals(检查相等性)、GetHashCode(获得散列值)、ToString(将对象作为字符串使用)
typeof 获取对象的类型信息(传的是类型名称)
Equals(对于字符串 把引用相等 变成了值相等(对于引用类型,调用 ReferenceEquals)) 和 ReferenceEquals(判断引用是否相等)
值类型包含简单数据类型 枚举 结构
引用类型包含 类 接口 数组
第四章 引用类型和值类型
类是对象的模板 对象是类的实例
枚举:一组已命名的整形常量 是强类型常量值列别,是一组描述性的名称(每个元素的基础类型是整形的 默认值从0开始 依次递增1)
结构(值类型)(也可以有构造函数(只能声名有参的)) 类是引用类型
不同: 类 结构
引用类型 值类型
可以被继承 不能被集成
可以有默认构造函数 不可以有默认构造函数
可以添加无参的构造函数 只可以添加有参的构造函数
创建对象必须用new 创建对象可以不用new
类中可以给字段赋值 结构中给字段赋值是错误的
相同:都可以包含字段 方法 都可以实现接口
定义结构变量可以不用new
值类型直接存储在栈中
Simple Type; Struct Type; Enum Type
三角箭头指向父类
值类型指向System.ValueType(所有值类型的父类)
引用类型指向引用类型(存储了对值的引用)
值类型和引用类型最后都指向System.Object
把值类型变量赋值给Object类型的时候,会发生自动装箱(boxing) 把Object变量赋值给一个与对象类型相同的值类型变量时, 需要进行拆箱
System.Collections;集合
System.Collections.Generic;集合的泛型
对值类型调用ToString()方法可以避免装箱
第五章 封装、继承、多态
继承:好处:提高代码重用性,实现多态
Inherit(继承):子类和父类存在is-a关系;
当一些类之间且有相同的属性和行为时,反这部分属性和行为抽象到一个父类中:(不同子类之间且有相同的功能,并且功能的实现方式也完全相同时,将该方法在父类中实现,提高程序代码的可重用性和可维护性;不同子类之间且有相同的功能,但功能的实现方式不一样时,将该方法放在父类中声明,但不提供具体的实现)
继承有传递性:(间接父类)(可以获取间接父类的方法)
继承的单根性:一个类的直接父类只有一个
base 在子类中指代它的父类; 在子类中调用父类的构造函数
继承中 如果父类写了带参数的构造函数 则默认无参的构造函数就被带参娄的构造函数覆盖了,不存在了;子类中构造函数默认会调用父类中默认的构造函数(解决方法:1. 在父类中添加默认无参数的构造函数; 2. 在子类的构造函数中指定调用父类中存在的构造函数)
有继承时的数据初始化顺序:创建子类对象的时候,在执行子类构造函数时,如果有父类,会先调用父类的构造函数,然后调用子类的构造函数(先实例化父类的数据成员,然后再实例化子类的构造成员)
子类继承父类,父类派生子类 子类也叫派生类 父类也叫基类
有继承关系时,执行子类构造函数时优先触发执行父类的构造函数
base 调用父类的方法 调用父类的构造函数
父类没有无参构造函数 子类必须指明调用哪个构造函数
new 静态绑定的一种机制
版本控制:继承环境下是一个C#机制 可以对类进行修改(创建新版本)不会意外地改变代码的含义
创建密封类的理由:优化:密封一个类避免了与虚方法有关的系统开销,这允许编译器执行特定的优化 安全性:将类密封消除了由继承造成污染的可能性(方法和属性也可以使用sealed修饰(被信息包的方法和属性不允许在子类中继承)
封装encapsulation
封装机制:属性(字段)、 索引器(数组的访问)、 方法、 访问修饰符(有用形式:代码隐藏)
当必需公开字段的访问时,推荐使用常量、枚举和只读字段
public、 private、 protected、 internal
类型(命名空间下)的默认访问修饰符为internal
类型成员的默认访问修饰符为private
内部类
多态(polymorphism(pao li mao fei ze mu)):类的子类表现出的行为可以各不相同,这种我称为类的多态性
多态利用虚方法 把子类方法都重写(vartual(启用多态)override(重写) 动态绑定(看new的是哪个对象))
多态使用场景:一个程序有一组对象(它们是不同的对象,但它们都有共性),检查第一个类型,并且执行合适的方法
第六章 抽象方法和抽象类
抽象类:(用来约束子类的行为(强制实现多态))
用abstract声名,不能直接实例化(不能new);
是用来作为基类的,用来提供多个派生类可共享的基类的公共定义 位天类继承层次的顶端;
抽象类可以包含抽象的成员 (抽象属性、抽象方法(没有方法体,用abstract修饰的方法))可以包含非抽象的成员,甚至可以包含虚方法;
子类必须实现抽象方法,除非子类也具有抽象性
数据成员也可以抽象
抽象方法必须用override重写
提供一系列约定,约束子类的行为(强制约束)
提供一些共性的行为
throw new NotImplementedException()未实现的异常
虚方法 抽象方法
用virtual修饰 用abstract修饰
要有方法体,哪怕是一个分号 不允许的方法体
可以被子类override 必须被子类override
除了密封类都可以写 只能在抽象类中
里氏替换原则:
子类的对象能够替换其父类
父类的对象不能够替换子灰
父类的方法都要在子类中实现或者重写
父类的可访问性不能比子类低
虚拟成员或抽象成员不能是私有的
接口:
接口是一种规格说明定义了类必须实现的行为
接口定义了类之间如何心良好定义和预期的行为进行交互的契约,显式定义了类之间应该如何进行交互
接口就是一组抽象成员的集合
接口类似天抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员
不能直接实例化接口
接口可以包含事件、索引器、方法和属性
接口不包含方法的实现 也不能包含字段
类和结构可从多个接口继承
接口自身可从多个接口继承
一个类同时继承类和接口时必须把类写在最前面
接口成员都是隐式公共的和抽象的(不能指定访问修饰符)
满足is-a用继承 不满足is-a还拥有类似的功能
接口更得于程序的扩展,抽象类使程序层次结构更清晰
不同点:
抽象类 接口
用abstract定义 用interface定义
只能继承一个类 可以实现多个接口
非抽象派生类必须实现抽象方法 实现接口的类实现所有成员
需要override实现抽象方法 直接实现
相同:
不能实例化 包含未实现的方法 派生类必须实现未实现的方法
theftproof(防盗的) burglarproof(防盗的)
面向接口编程(传递接口)
第七章 委托和事件
委托 delegate(最终(本质)是类) 使程序可以在运行时动态调用不同的方法
它所调用的方法的名称 该方法的参数 该方法的返回值
一类方法:具有相同的参数与返回值的方法
public delegate int(返回值类型) Call(委托名称)(int num1, int num2);委托和方法必须具有相同的参数和返回值
定义委托类型
[访问修饰符] delegate 返回类型 委托名 (形参表);
声明委托对象
委托名 委托实例名;
创建委托对象(确定与哪些方法进行绑定)
委托实例名 = new 委托名(某个类的方法);
使用委托调用方法
委托实例名(实参表);
委托类型一般声名在命名空间内 也可以创建在类内部
委托是一种数据类型,与类的级别相同 (一般定义在命名空间之内)(除非与某个类关系十分紧密 写到类里面)
方法与方法之间 类型与类型之间 要保留空行 单行注释写后面
方法内逻辑用空行隔开
委托链
事件是具有类型成员身份、有限制的调用以及赋值等特殊特性的委托
发送事件的类称为“发行者”,也称为“事件源”
接收事件提类称为“订户”,也称为“接收者”
[修饰符] event 委托名 事件名;
事件实际就是一种特殊的委托对象
delegate void MyEventHandler();
事件的声明
class
事件的订阅就是向委托的调用列表中添加方法,是通过事件加上运算符 += 来实现的
事件名 += new 委托名(方法名);
要先判断事件对象是不是空的
事件:
定义委托(未来指向事件处理函数)
基于MyEventHandler委托声明事件
定义事件的方法(执行事件处理函数)
订阅事件(向事件的委托链中注册方法(事件处理函数))
EventArgs(是包含事件数据的类的基类)
异常处理
try块(可能出现异常的代码)catch块(出现异常时对异常的处理)
异常指运行时的错误finally(无论有没有异常 最终都会执行)善后工作(资源的清理和释放)throw(抛出异常)是吧catch块出现的异常继续往上抛
自己写完的代码 自己测了没有任何问题之后再交给测试
System.Exception(异常)
System.SystemException(公共语言运行时引发异常)
System.ArgumentException:System.ArgumentNullException
System.ArithmeticException:System.DivideByZeroException | System.OverflowException
System.Data.DataException
System.FormatException
System.IO.IOException
System.IndexOutOfRangeException
| System ApplicationException(用户程序引发异常)
throw new Exception(用于抛出新的异常)
第八章 集合 范型
System.Collections.Generic;(存集合 泛型)
Ienumerable(实现了这个接口就可以foreach遍历)
<T>(T代表Type类型) | <K,V>(代表泛型)
Icollection 接口是System.Collections 中最基础的接口,定义了集合类型支持的行为
ArrayList(是一个可动态维护长度的集合(动态数组))(Count(个数))(.Remove(对象名) | .RemoveAt(索引))
Hashtable(字典)
Queue(队列:先进先出的数据结构(FIFO))
SortedList
Stack(堆栈(后进先出(LIFO)))
Idictionary<K, V> 是Hashtable的泛型版
泛型接口
使用非泛型类实现泛型接口(泛型接口必须指定数据类型,失去了泛型接口的意义)
使用泛型类实现泛型接口
定义一个泛型类 后边可以用where限制T的类型
where : struct 值类型
where : class 引用类型 类 接口 委托 数组
where : new() 必须要包含无参数的构造函数 与其它约束一起使用时, 必须最后指定
where : <基类名> 是指定类或它的派生类
where : <接口名称> 可指定多个接口约束,约束接口也可以是泛型的
where : U T 要么是U类型 要么是U类型的子类
IComparable[<>],Icomparer[<>] 比较接口
委托名 = () => {方法体};(一条语句可以省略{}和return);
Lambda表达式 =>(gos to(分隔符)) 左侧是参数列表定义(无参数的写括号; 一个参数可以省略小括号) 右侧是方法体的定义方法体的多条语句用大括号括起来
using System;
namespace 泛型委托
{
class Program
{
static void Main(string[] args)
{
//调用TestMethod
//法一
//Call call = Say;
//TestMethod(call);
TestMethod(Say);
Console.WriteLine("-------------------------------");
//法二
//call = delegate(int num) { return num * 10; };
//TestMethod(call);
TestMethod(delegate(int num) { return num * 10; });
Console.WriteLine("-------------------------------");
//法三
//call = x => x * 10;
//TestMethod(call);
TestMethod(x => x * 10);
Console.WriteLine("-------------------------------");
Console.ReadKey();
}
private static int Say(int num)
{
return num * 10;
}
public static void TestMethod(Call call)
{
int re = call(10);
Console.WriteLine(re);
}
}
public delegate int Call(int num);
}
泛型类就是一个模板类(泛型参数)
Action 无参数 无返回值的委托
Action<T...> 有n个参数 无返回值的委托(0 <= n <= 16)
Func<T...> 有n个参数 有指定返回值类型的委托(0 <= n <= 16)
Binary 二进制
Directory计算机目录结构
DriveInfo计算机驱动器的详细信息
File、FileInfo
Environment.CurrentDirectory(物理路径)
Exists(检测文件是否存在)
文件操作
创建文件流
[创建读写]
执行读写操作
[关闭读写]
关闭文件流
FileMode枚举 Create(创建新的 已存在就改写) Open(打开) CreateNew(创建新的 已存在报错) Append
FileAccess
FileShare(None(读占))
StreamWriter创建写入器,写入一个流
大文件读写
Using 语句
实现Idisposable接口的类可以用using语句自动释放资源
常用的有(File Font等)
多个对象用’,’分隔
System.Text.Encoding.Default.GetString(bytes(字节数组))字节数组直接转成字符串
System.Text.Encoding.UTF8.GetBytes(info(字符串))将字符串转换成字节数组
写入必写:fs.Flush() 清空缓冲区,确保写入文件
优点:
XML文档的内容和结构完全分离
互操作性强:作为纯文本格式的文件,可以方便也穿越防火墙,在不同操作系统上的不同系统之间通信
规范统一:XML具有统一的标准语法
支持多种编码
可扩展性强
使用:
数据交换(Json)
Web服务
内容管理
Web集成
参数配制
结点的属性 结点的内容
XmlDocument 表示当前XML整个文档
DocumentElement属性 获取根节点(Element(元素))
ChildNodes 获取所有子节点
Load() 读取整个XML的结构
XmlNode 对象表示XML文件的单个节点(不分根结点还是子结点) 子节点都是XmlNode
Load() 读取整个XML的结构
InnerText属性 当前节点的值
Name属性 当前结点名称
ChildNodes属性 当前节点的所有子节点
TreeView控件 每次都要清空节点 否则会累加
Tag属性 可以绑定与对象关联的用户定义数据
bookNode.Attributes[“”].value;
SelectSingleNode 选择唯一的一个结点
SetAttribute(“属性”, “值”) 添加属性
AppendChild() 括号中添加到调用都的子结点的末尾
Save()保存
RemoveChild() 删除节点
序列化/反序列化(serialization)
GUI图形用户界面
[Serializable]特性标志的才可以序列化(想要序列化 他的父类也要标记)
System.Runtime.Serialization;命名空间下
BinaryFormatter(二进制格式化器)
SOAP:简单对象访问协议
[NonSerialized]不被序列化
System.Runtime.Serialization.Frmatters.Soap;
System.Xml.Serialization
XmlSerializer xs = new XmlSerialiser(类型)
自定义序列化需要让类实现Iserializable接口
自定义构造函数 传对象(实现接口的一样)(反序列化时用)
Procss进程
Thread线程 进程的一个执行单元,一个进程可以包含若干个线程
线程是CPU调度和分配的基本单位
每个进程都有一个主线程
suspended 轮询
Process.GetProcesses(“”)指定计算机上的进程列表
ListView控件 支持视图(View属性 有五种视图)(Details(显示多列))
ListViewItem ListView的数据项
LargeImageList(大图标列表)
Details 要设置列的集合
多线程
System.Threading 命名空间
Thread类
IsAlive属性 指示当前线程执行状态
IsBackround 指示某个线程是否为后台线程
Priority属性
Start方法 启动线程
Join方法 一般出现在Abort之后
Sleep方法
Abort方法 引发ThreadAbortException 开始终止此线程
调用Sleep方法的是类的本身,而不是类的实例
休眠的是该语句所在的线程,而不是其它线程
Highest AboveNormal Normal BelowNormal Lowest(优先级)
Main 方法是主线程
同一时间只有一个进程能进入代码临界区
在非创建控件的线程中访问控件,这是C#中不允许的
每个控件上都有一个方法叫Invoke(在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托)
IP(Internet Protocol(Internet网络协议))
21 FTP协议
23 远程登陆
25 SMTP(Simple Mail Transfer Protocol(简单邮件传输协议))
53 域名服务器(DNS)
80 HTTP协议
OSI 开放系统互连参考模型(物理层、数据链路层、网络层(IP协议)、传输层(TCP协议)、会话层、表示层、应用层)
TCP/IP 是一组网络通信协议的总称,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机
System.Net;
IPAddress IP地址的转换、处理等功能
Dns 本地或远程域名等功能
IPHostEntry Internet主机相关信息
IPEndPoint 网络地址表示为IP地址和端口号
套接字
套接字是支持TCP/IP协议的网络通信的基本操作单元(可以看做是不同该机间的进程进行双向通信的端点,构成了单个 主机内及想个网络间的编程界面)
Socket(套接字)
Network Management Software(网络应用)
套接字 分同步 异步两种
同步在通过Socket进行连接、接收、发送操作时,客户机或服务器在接收到对方响应前会处于阻塞状态。它适用于数据处理不太多的场合
异步在通过 Socket进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback(回调函数)机制进行连接、接收和发送处理,这样的可以在调用发送或接收的方法后直接返回,并继续执行下面的程序处理
System.Net.Sockets
常用的两个类:TcpClient(用于连接、发送和接收数据) TcpListener(用于监听是否有传入的连接请求)
UdpClent UDP(用户数据报协议)
Socket类
面向连接的套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认
属性:
ReceiveBufferSize 接收缓冲区大小
SendBufferSize 发送缓冲区大小
方法:
Colse 关闭TCP连接并释放与TcpClient关联的资源
Connect 将使用主机名和端口号将客户端连到远程TCP主机
GetStream 返回用于发送和接收数据的NetworkStream
Buffer(缓冲区)
TcpListener 具有侦听进入的TCP连接的方法
方法
AcceptSocket 返回与过程客户端通信的套接字
AccepTcpClient 接受的连接请求
Start 开始侦听进入的连接请求
Stop 关闭侦听器
程序集:.exe .dll
程序集结构:程序集清单、类型元数据、IL代码、资源
AssemblyInfo.cs用于配置程序集的(在Properties文件夹下)
元数据:完整地描述类型(类 接口 结构 枚举 委托)的能力 是.NET平台的整体上关键要素
Extends(继承)
Field (源数据)
特性就是用于类型(类、接口、结构等)、成员(属性、方法等)、程序集或模块的代码注解(最主要目的就是自描述)
[CL SCompliant] 强制被注释项遵从CLS
[DllImport] 允许.NET代码调用任意非托管的C或C++基类库,包括操作系统中的API
[Obsolete] 过时的 带true就会产生编译错误
[Serializable] 可序列化
[NonSerialized] 不可序列化
[WebMethod] 可通过HTTP请求调用
Attribute 所有属性的基类
自定义特性类要在最后缀上Attribute
GetType() typeof()
反射(reflection) 反射用于在运行时通过编程方式获得类型信息
Assembly
AsseblyName
EventInfo
MemberInfo
MethodInfo
ParameterInfo
PropertyInfo
Type t = Type.GetType(“类型名称”);
t.GetMethod();获取对应类型的所有公共方法
t.GetFields();获取对应类型的所有公共字段
t.GetProperties();获取对应类型的所有公共属性
t.GetInterfaces();获取对应类型的实现或继承的所有接口
t.BaseType;获取直接父类
t.IsAstract;(是不是抽象的)
t.IsSealed(是不是密封的)
t.IsGenericTypeDefinition(是不是泛型定义)
t.IsClass(是不是类)
t.IsInterface(是不是接口)
晚期绑定:是一种创建一个给定类型的实例并在运行时调用其成员,而不需要在编译时知道它存在的一种技术
反射就是一种晚期绑定(花费更多的系统资源开销使得应用程序可以在运行时获取一些未知的信息)
Assembly ass = Assmbly.LoadFile(“程序集路径”);加载程序集
Type t = ass GetType(“MyAssembly.Car”);
ass.CreateInstance(“指定类型”);(使用系统激活器创建类的实例)创建对象(通过反射创建的对象都是object类型)
Activator(System命名空间下)(使用默认的构造函数创建类的实例)
Instance(实例)
MethodInfo m = t.GetMethod(“方法名”);
m.Invoke(, )两个参数 一个是程序集对象 一个是object类型的数组(方法返回值也是object类型的)
c#基础浅学