zoukankan      html  css  js  c++  java
  • 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项目重新部署 很麻烦
    《敏捷软件开发 原则模式与实践》

    版本控制 多人协作

  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/yongchao/p/13277064.html
Copyright © 2011-2022 走看看