一、C#基础
- 接收来自用户的输入
int num = Convert.ToInt32(Console.ReadLine());
// Console.ReadLine()只接收字符串格式的数据
-
位运算符
- &:按位与
- |:按位或
- ^:按位异或(同0异1)
- ~:按位取反
- <<:左移运算符(左边去掉,右边补0)
- >>:右移运算符(右边去掉,前面补0)
-
internal访问修饰符:带有internal访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
-
可空类型==?==
int i1 // 默认值为0 int? i2 // 默认值为null
-
合并运算符==??==
如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。
-
结构类型Struct与类的区别
- 类是引用数据类型,结构是值类型
- 结构不支持继承
- 结构不能声明默认的构造函数
- 结构成员不能指定为 abstract、virtual 或 protected
- 结构可以不使用New关键字进行实例化
- 如果不使用New关键字,只有在所有的字段都完成初始化后,字段才被赋值,对象才被使用
- 结构体中声明的字段无法赋予初值,类可以Question:WHY?原因是什么?
- 类存储在堆空间中,而结构存储在栈空间,由于栈速度>堆(空间大)速度,所以当我们描述一个轻量级对象的时候,可以使用结构而不是类
-
类的默认访问修饰符是internal
-
析构函数用于在程序结束之前释放资源,析构函数不能继承或重载,可以理解为java中finally关键字在try-catch中的作用
-
派生类(派生类:基类)
using System; namespace InheritanceApplication { class Shape { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height; } // 派生类 class Rectangle: Shape { public int getArea() { return (width * height); } } class RectangleTester { static void Main(string[] args) { Rectangle Rect = new Rectangle(); Rect.setWidth(5); Rect.setHeight(7); // 打印对象的面积 Console.WriteLine("总面积: {0}", Rect.getArea()); Console.ReadKey(); } } }
-
动态多态性(通过抽象类和虚方法实现)
-
通过在类定义前面放置关键字sealed,可以将类声明为密封类,即不能被继承,所以抽象类不能声明为密封类
-
virtual和abstract实际的开发场景是什么?
1.virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。
2.virtual可以被子类重写,而abstract必须被子类重写。
3.如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。
4.无法创建abstract类的实例,只能被继承无法实例化。
-
-
预处理器指令
二、C#高级
-
输入输出流知识点
- 当输入流中输入的内容为中文,bytes数组的长度不够用,需要使用byte[] bytes= Encoding.UTF8.GetBytes(message);的方式将数据从字符串类型转换为字节类型。
-
委托和事件
- 多播委托
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _001_初识Csharp { class Program { // 注册委托 public delegate void OrderDelegate(); static void Main(string[] args) { // 实例化委托 OrderDelegate od = new OrderDelegate(Order.BuyFood); // 多播委托 od += Order.BuyCake; od += Order.BuyFlower; od(); // 调用委托 } } class Order { public static void BuyFood() { Console.WriteLine("购买食物"); } public static void BuyCake() { Console.WriteLine("购买蛋糕"); } public static void BuyFlower() { Console.WriteLine("购买鲜花"); } } }
- 匿名委托
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _001_初识Csharp { class Program { // 注册委托 public delegate void AreaDelegate(double length,double width); static void Main(string[] args) { Console.WriteLine("请输入长方形的长!"); double length = double.Parse(Console.ReadLine()); Console.WriteLine("请输入长方形的宽!"); double width = double.Parse(Console.ReadLine()); AreaDelegate areaDelegate = delegate { Console.WriteLine("长方形的面积为:"+length*width); }; areaDelegate(length,width); } } }
- 事件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _001_初识Csharp { // 实例化类=>实例化事件=>触发事件=>事件调用委托=>委托调用委托中的方法 class Program { // 注册委托 public delegate void SayDelegate(); // 注册事件 public event SayDelegate SayEvent; // 定义委托中调用的方法 public void SayHello() { Console.WriteLine("Hello"); } // 创建触发事件的方法 public void SayEventTrigger() { SayEvent(); // 这里必须和事件同名 } static void Main(string[] args) { // 实例化事件需要使用类的实例的事件指向委托(委托中需要传入委托方法) // 创建Program类的实例 Program program = new Program(); // 实例化事件,使用委托指向处理方法 program.SayEvent = new SayDelegate(program.SayHello); // 调用触发事件的方法 program.SayEventTrigger(); } } }
三、UI Automation
- using System.Windows.Automation;
- using System.Threading;
- using System.Windows;
- using System.Windows.Forms;
- using System.Diagnostics;
1. UI Automation
UIA主要有4个DLL:
- UIAutomationProvider.dll,定义了各种行为的interface;
- UIAutomationClient.dll,定义了各种控件模式以及一些用来支持更好的定位控件的辅助条件搜索类;
- UIAutomationCore.dll,用来支持UIAProvider和UIAClient之间通信;
- UIAutomationClientSideProvides.dll,用来支持传统的winform的标准控件。
关系如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-brOK6Tet-1625024519301)(http://hi.csdn.net/attachment/201107/27/0_1311748913x5ye.gif)]
2021/6/29遗留问题:TreeWalker、user32.dll