C#-Bilibili_CSharp

C#-Bilibili_CSharp

https://www.bilibili.com/video/av2357992
C#本质论.pdf

文件以.cs保存
C#支持中文

输出 System.Console.WrtieLine();
输入 System.Console.Read();
占位符 System.Console.WrtieLine("{0}{1}",,);

字面值有默认类型 int double
1.1f//float
1.1m//decimal
指数写法 2E2 //200
十六进制 0xff //255
字符串中 使用@ 可以不适用转义(写路径时)

//判断代码执行时间

using System.Diagnostics;
Stopwatch 计时器=new Stopwatch(); //支持中文
计时器.start();
....
计时器.start();
System.Console.WrtieLine(计时器.ElapsedMilliseconds);

//StringBuilder 在多次操作string时 可能比string 快,需要测试
StringBuilder sb=new StringBuilder();

//string 的空值
string.Empty
""

null //含义不固定,需要设置

//可空修饰
int? number=null; (和数据库交互)

//
var //声明

//类型转换
//显示转换 高到低
int.MaxValue;// int 最大值
checked{} //检测溢出。
//隐式转换 低到高
//转换函数
Parse();//解析字符串,非数字会出问题,考虑TryParse
System.Convert();
ToString();
TryParse

//运算符
?:
??//空接合运算符,检查是否为空,A??B A若为空 输出B

//循环
foreach(long x in a){};

//随机数
var r=new Random(); r.Next();

//C#预处理指令
#region #endregion //折叠代码段

//list

var nums =new List<int>();
nums.Add(3);
nums.Sort();
nums.Remove();

// 命名空间 类 方法 参数
//静态方法 只能调用静态方法
//传值、传引用ref、out参数
ref string//字符串不变性

重载 参数 //操作符重载,赋值操作符不能被重载
重载自定义的类型转换操作符,须用implicit(隐式转换)或 explicit(显示转换)关键字

泛型 模板 T Func()
可变参数 关键字:params 必须放在参数的最后 // int Func(params int[] nums);

//-Exception
捕获并处理异常 try{} catch(){}finally{} //try 然后两次tab键 try 1/catch */finally 1
catch(){ throw;}//抛出异常,外层函数处理。
没有throw时,程序遇到异常会继续执行。

/*
long FileOrDirCount(string path){
	long count=0;
	try
	{
		//
	var files =Directory.GetFiles(path);
	count += files.Length;	
	  	//
	var dirs = Directory.GetDirectories(path);
	foreach(var dir in dirs)
	{
 		count += FileOrDirCount(dir);
	}
	}
	catch( UnauthorizedAccessException ex)
	{
	 System.Console.WriteLine(ex.Message);
	//throw;
	}
	return count;
}
*/

默认参数
命名参数

main的参数和返回值

//类
面向对象: 封装 继承 多态
类的修饰符 默认是private
//public、 protected、 protected 、internal 、protected internal
属性 中get、set; // prop 两次tab自动生成get、 set

/*
public string Name{get; set;}
*/
/*
 public string Name
{
 	get{return _Name};
	set{_Name=value;}//这里可以抛出异常
}
*/

在同一个类中(针对同一个对象实例),从一个构造器中调用另一个构造器,C#采取的语法格式是在一个冒号后面添加this关键字,再添加与被调用构造器对应的一个参数列表

静态成员 具有全局性,属于类型,非实例
其字段属性访问时不需要实例
其方法内部不能使用this
其构造器,初始化内部成员
其类 Main

//设计模式 23种 ////《设计模式之禅》
之一 单例模式 // ...
之二 工厂模式 // 用到抽象
之三 策略模式
之四 订阅/发布模式
之五 GRASP

readonly 运行时 //仅能在声明、构造函数中赋值
const 编译时

嵌套类
分布类 ,partial
分布方法,在分布类中 partial void Func();// 必须是void

//继承 冒号:
单一继承
private 不能被继承
protected 可以用于继承派生
密封类 ,sealed
base 访问基类的成员、构造函数
类型转换 基类 A = new 子类();//反向,会有问题

多态:一个类型,多种状态
virtual override //用于属性、方法; 将变化封闭 ;override 可以 继续继承

abstract 抽象类 ,实例化后无意义
代表抽象的实体
定义抽象成员后 属性、方法 不再需要提供 默认实现了
并强制派生类 提供实现

Thread.Sleep(1000); //1000ms

所有类 是从System.Object 派生
is //判断
as //转换

//接口 ///方法的集合,隐式接口常用
弥补单一继承的缺陷 跨继承的多态
interface
跨继承
继承(作用是共享代码)只能一次,接口(首选)>抽象类
接口可以继承接口
注意:
接口的语义
一个类可以实现多个接口,无限制
所有方法、属性必须实现
成员都是public
标准术语:实现接口
无法实例化一个接口
显示/隐式接口
隐式的接口,必须要有public访问修饰符
显式的接口不能有任何的访问修饰符
隐示实现对象声明为接口和类都可以访问到其行为
显示实现只有声明为接口可以访问

//UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言
vs可以查看类图 需要安装时选择类设计器组件

struct 值类型
enum 值类型

//泛型
where T:struct//约束,值类型
泛型使用在类、方法、接口
最常用泛型,集合

//vs的程序结构
解决方案 .sln
项目(程序集[Assembly]包 模块)dll exe
命名空间 (避免一个项目中 重命名)

dll// 动态链接库
导入dll: 1.手动 2.[DLLImport(...)],仅用于方法

//垃圾回收
内存管理的一种方式
栈 堆(new 托管堆)

//资源清理
确定性终结
using
IDisposable

//写入 读取文件 流

/*
StreamWriter sw=new StreamWriter(new FileStream("filename",FileMode.Create,FileAccess.Write));
sw.WriteLine("123");
sw.Close();
*/
/*
using(var sw=new StreamWriter(new FileStream("filename",FileMode.Create,FileAccess.Write)
{sw.WriteLine("123");}
*/

装箱 拆箱
弱引用
延迟初始化

//委托 匿名函数
回调函数
Lambda
简化:

语句Lambada	:
		(type var,...)=>{...};
		(var,..)=>{...};
		var=>{...};
		()=>{...};
	表达式 Lambda
		没有{},只能有一条语句

系统自带的 泛型委托

	Action<>  ,例List<T>.ForEach();
	Func<>	  ,例List<T>.Sum();
	Predicate<>,例List<T>.FindAll();    List<T>.Find();

Lambda访问外部变量
表达式树
//多播委托 ///链表式+= -=
将公共操作统一到接口实现。
订阅、注册
退订、取消注册

包容类、外部类
//关键字event

/*
public delegate void XX(Newspaper n);
public event XX xx;
*/

提供两个额外封装
提供更加抽象

//迭代器

yield return;
yield break;

//集合
实现IEunmerablede接口的类
foreach 具有不可修改的特性 //与for相比
常用集合:

List<T>
Dictionary<TKey,TValue>
  字典的遍历  字典的字典  键值数据库
SortedList SortedDic...
Stack<T>
Queue<T>
LinkedList<T>

匿名类型 new{...}
隐式类型 var
集合初始化器
对象初始化器

扩展方法
扩展已经封闭的代码
使用方法:
1.定义静态类
2.定义静态方法
3.使用this关键字指示实例化对象

//标准查询运算符
IEnumerable中每一个方法
所有的方法定义在System.Linq.Enumerable中
使用时,只需要using System.Linq

//Linq ////https://www.bilibili.com/video/av2357992/index_14.html?t=3369#page=15
Language INtegrated Query 语言集成查询
查询表达式
Where
投影 Select 得到指定路径的 文件名 和大小
Count
如果if(list.Count()>0){...} 可以使用list.Any
排序 OrderBy ThenBy //只能有一个OrderBy,后面的会覆盖之前
分组 GroupBy
连接 Join
删除重复Distinct、
并集 Union
交集 Intersect
连接 Concat
延迟查询
SelectMany() 处理集合的集合
左外连接 右外连接 全外连接
///《LINQ IN ACTION》

//反射
运行时 操作某个类型的元数据
两种方法:
实例.GetType()
typeof(类型)
注 一个类型只有一个type
func.Invoke

根据字符串 创建类
Assembly
.Load("程序集名称")
.CreateInstance("命名空间.类名")
配合接口使用
封闭变化的利器

//特性
展示一下程序集文件中的 特性
用途:提供一个额外元数据
AttributeUsage

/*
public class RequiredAttribute:System.Attribute
{
	public static bool IsPropertyRequired(object obj)
	{
	var type =obj.GetType();
	var properties =type.GerProperties();
 	
	foreach(var propetry in properties)
	{
		var attributes = 		propetry.GetCustomAttributes(typeof(RequiredAttribute),false);
		if(attributes.Length>0)
		{
			if(propetry.GetValue(obj,null)==null) return false;
		}
	}
		return true;
	}
}
*/

//序列化、反序列化

BinaryFormatter.Serialize
BinaryFormatter.Deserialize

//动态编程 ///可以解析xml
dynamic

//多线程
进程--〉线程
线程间可以共享数据
线程是切换执行的
创建线程 、
第一种方法,无返回值

	var task = new Task(..);
  注  task.Start()   
	  task.Wait()

第二种方法,可有可无返回值

 	var tast = Task.Factory.StartNew(..);
  注  task.Result()会阻塞   
	  直接执行,无需Start();

线程上的异常处理,//线程内的异常被抑制
方法一

try 下面的语句,即可捕获
  task.Wait()
  task.Result()
  task.WaitAll()
  task.WaitAny()

方法二
使用task.ContinueWith(..)

//并行处理

Parallel.For()
Parallel.ForEach()
PLINQ -- x.AsParallel().x

//同步
原子性 线程安全
使用lock关键字
使得操作具有 原子性
对可变的状态进行同步
不更改的东西不需要同步
个线程访问同一个对象时,必须加锁

/*
private static readonly object Syn= new object();
*/
//Interlocked
/*
Interlocked.Increment();
*/

//Debug.Assert();///断言

//Datetime
var dt=Datetime.Now;
dt.ToString("格式")
使用前导0格式。 ///可以比较大小
Datetime.Parse();

//internal ///用于dll修饰
修饰的类只能在包内部使用

//GUID
全局唯一标识符
var guid=GUID.NewGuid().ToString("D");

//访问excel
com组件
OleDbConnection
引用别人的DLL,如NPOI

//正则表达式
....

//访问剪贴板
Clipboard.SetText(...)
对于控制台稍微要麻烦点
添加了Forms引用后,还需将Main函数头上加上[STAThread]特性
对于多线程使用Clipbroad这个类也是要将线程模式设置为STA

//避免硬编码,参数化配置
常用反射 配置文件 数据库
因为CS项目重新部署 很麻烦
《敏捷软件开发 原则模式与实践》

版本控制 多人协作

原文地址:https://www.cnblogs.com/yongchao/p/13277064.html