作者: littleboy 2022-09-12 11:53:21

C# 学习笔记

C#基本结构

程序的执行从 Main 方法开始。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using system //System 命名空间
namespace 项目名
{
class 类名
{
public int 变量名 //字段,用于声明变量

static void main(string[] args) //主函数(也可称为方法)
{
Console.WriteLine("Hello World");
Console.ReadKey();
}
}
}

基本语法:

1、标识符:

是用来识别类、变量、函数或任何其它用户定义的项目。标识符不能是关键字。

1
2
3
4
5
6
7
public class test //test 是标识符.类
{
public void add() //add 是标识符.函数
{
int a=0 //a 是标识符.变量
}
}

2、关键字:

C# 编译器预定义的保留字。这些关键字不能用作标识符。关键字注释参考:说明手册

3、数据类型:

值类型变量:

可以直接分配给一个值,属于在栈中开辟一个内存空间并存入值。常用值类型如下:

bool 布尔值 True 或 False
char 16 位 Unicode 字符
double 64 位双精度浮点型
float 32 位单精度浮点型
int 32 位有符号整数类型

引用类型:

不包含存储在变量中的实际数据,而是存入对变量堆中位置的的引用。

1、引用类型.对象(Object)类型
object obj;
obj = 100;
2、引用类型.动态(Dynamic)类型
dynamic &<&variable_name&>& = value;
dynamic d = 20;
3、引用类型.字符串(String)类型
String str = “runoob.com”;

命名空间:

namespace 命名空间(有点类似C的库)

类:

public class person //例如人类,

类语法:

类成员:字段(存数据private只能在当前类中访问);属性(保护字段);方法;构造函数(初始化)

属性结构:

1
2
3
4
5
public int X 
{
get{return a}
set{a=value}
}

调用当前对象内容:this.X:或this.int a

新建对象:

1
person Leon=new person() //例如我(littleboy)这个人类的对象

常见常/变量

常量:

const int a

枚举:

[public] enum a { 内容1内容2 }

a X = a . 内容1

结构:

[public] struct 结构名 { public string _内容1 ; public int _内容2 }

结构名 X X._内容1 ; X._内容2

数组:

存储相同类型的变量,区别于结构(存储不同类型的变量)

值类型:

int、 double、char、bool、decimal、enum、struct。是栈类型:可以被赋值改变而释放(重用)内存

引用类型:

string、数组、自定义类、集合、object、接口。是堆类型,字符串(特殊)不可变性,被赋值改变是选择新开辟内存,并在栈中重新指向。不释放内存,卡由GC处理。

类型转换:

1、double a = 3.14;int b = (int)a // 数字转数字

2、int a = 3;double b = a // 数字转数字

3、double a = convert. todouble(str); // 字符串转数字,

封箱/拆箱:

封箱:是把值类型转换为引用类型(System.Object),或者转换为值类型实现的接口类型。

拆箱:是将引用类型转换为值类型。

运算符:

++,– (一元运算符)优先,且运算完返回变量。

+,-,*,/,% (二元运算符)

+=,-=,*=,/=,%= (二元运算符)缩写写法

(举例:)

1
2
3
a++
a+b
a+=b

逻辑符:

&&(且),需要同时满足;

||(或),需要满足其中一项;

!(非),对结果取反

逻辑符可以混搭累加使用

常见语句结构:

1、 判断

if结构及延伸if结构(网站查)

switch 定值判断

2、 循环

for(,,)

foreach( var item of array[] )

while(1);需要有结束条件,不然就是死循环

do-while 先执行一遍do

3、 循环结构特殊判断:

break

Continue

4、 异常提醒:

try { 需要检查异常的语句 } catch { 提供提示语句,例如:console.writeline(“有错误,请检查”)}

三个参数:

1、 out****:

用于一个方法返回多个类型的值,

public static void 方法名(int[] a , out int b , out string c)

2、 ref****:

将参数代入方法,并且可以返回值。

[public] static 返回值类型 方法名(ref [参数列表])

方法名(ref [参数列表] )

3、 params****:

多用于数组的添加和减少

[public] static 返回值类型 方法名(params [参数列表]) 方法名( 无需跟格式 )

方法的重载:

同名不同类型,用一个名字的方法并列编写,只是参数不同。

方法的递归:

方法调用自己方法,

构造函数:

方便对象初始化

1
2
3
4
5
6
7
pubilc 类名(int a,char b,string c)
{
this.X1=a;
this.X2=b;
this.X3=c;
}
person Leon=new person(a,b,c)

析构函数:

~类名()//当程序结束时 析构函数才执行。可用于释放资源,减少内存。

封装:

被定义为”把一个或多个项目封闭在一个物理的或者逻辑的包中”。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。C#中的访问修饰符:(能修饰类的修饰符只有两个:public、internal)

1
2
3
4
5
public:公开
private:私有,本类使用(默认)
protected:保护,本类+子类使用
internal:只能在当前项目使用
protected internal:访问限于当前程序集或派生自包含类的类型

(来自“菜鸟教程”高赞比喻)

比如说:一个人A为父类,他的儿子B,妻子C,私生子D(注:D不在他家里)

如果我们给A的事情增加修饰符:

1
2
3
4
5
public事件,地球人都知道,全公开
protected事件,A,B,D知道(A和他的所有儿子知道,妻子C不知道)
private事件,只有A知道(隐私?心事?)
internal事件,A,B,C知道(A家里人都知道,私生子D不知道)
protected internal事件,A,B,C,D都知道,其它人不知道

继承:

public 子类:父类

子类不调用父类的构造函数,但会默认调用父类的无参构造函数,

解决方法:1、父类写无参构造函数;2、用base(a,b,c)继承

多态:

让一个对象能表现多种状态(存在子类多态情况使用,表达子类不太的方法)

3个方法:

1、虚方法:“public virtual void 函数名()”将父类方法标记为虚方法加virtual,子类加override。作用是对象是谁就用谁的方法。

2、抽象类:“public abstract void 函数名()”当父类不知道如何实现方法时,可做为抽象类,函数写成抽象函数(是没有函数体的,没有大括号“{}”。所以函数不执行)。

3、接口:

集合:

ArrayList,用于泛型集合(长度可变)

HashList,键值对集合

dictionary ,字典集合

list 泛型:list a= new list()

文件处理类,

Path 路径

Filestream文件流?

1
2
3
using(filestream a=new filestream(@路径))
streamread&streamwriter(对象)读取&写入
streamwriter a=new streamwriter(@“路径”); a(写入内容)

序列化&反序列化[serializable]:

对象<——>二进制转换

1
2
3
4
5
6
7
using(filestream a=new filestream(@路径))
Binaryformatter a=new binaryformatter();
a.serialize()//开始序列化对象

using(filestream a=new filestream(@路径))
Binaryformatter a=new binaryformatter();
a.deserialize()//开始反序列化对象

部分类/密封类:

部分类:public partial class 类名 {} 用于多人同写一个类,避免重名

密封类:public sealed class 类名 {} 用于避免被继承,但可以继承别人的类

接口:

1
2
3
4
5
[public interface Iable],使用继承方式接口。
{
​ 成员;
void F();//接口中的成员默认不允许添加访问修饰符,默认是public,区别主函数。
}

接口特点://不能实例化// 不允许写具体方法体函数//自动属性

显示实现接口:

其他知识点

COM

COM 技术概述 - Win32 apps | Microsoft Learn

\1. ref,需单独初始赋值

\2. 数组长度定义需新建对象:int[ ] x = new int[ 100]

\3. 静态类可以直接 类.方法名();

\4. \是转意符,@取消本行的\转意符作用)

//去除指定字符后的内容

string Name2 = “PART1 2022-41”;

Debug.WriteLine(Name2.Substring(0,Name2.LastIndexOf(‘-‘)));

返回:PART1 2022

算法使用

栈:

队列:

哈希表:

字典树:

LRU:

排序:

计算几何:

深度优先搜索(穷举):

贪心:

默认快捷键:

CTRL+k,c 注释选中行

CTRL+k,u 取消对选中行的注释

CTRL + SHIFT + B:生成解决方案

CTRL + F7 :生成编译

CTRL + SHIFT + O:打开项目

CTRL + SHIFT + C:显示类视图窗口

F1 :帮助

F4 :显示属性窗口

F5:开始调试,遇到断电停止

F9:设一个断点

F10:执行下一个函数

F11:执行下一个语句

F12 :转到定义

CTRL + F5:运行不调试

Shift+F11就会执行到当前函数末尾

F5就会执行到下一个断点

SHIFT + F4:显示项目属性窗口

CTRL + SHIFT + E:显示资源视图

CTRL + F12:转到声明

CTRL + ALT + J:对象浏览

CTRL + ALT + F1:帮助目录

CTRL + F1 :动态帮助

SHIFT + F1:当前窗口帮助

CTRL + ALT + F3:帮助-搜索

SHIFT + ALT + ENTER:全屏显示

CTRL + -:向后定位

CTRL + SHIFT + -:向前定位

CTRL + PAGE DOWN:光标定位到窗口上方

CTRL + PAGE UP:光标定位到窗口下方

CTRL + F6 :

CTRL + TAB:下一个文档窗口

CTRL + SHIFT + F6 :

CTRL + SHIFT + TAB:上一个文档窗口

ALT + F6:下一个面板窗口

CTRL + K, CTRL + L:取消remark

CTRL + K, CTRL + C:注释选择的代码

CTRL + K, CTRL + U:取消对选择代码的注释

CTRL + M, CTRL + O:折叠代码定义

CTRL + M, CTRL + L:展开代码定义

CTRL + DELETE:删除至词尾

CTRL + BACKSPACE:删除至词头

SHIFT + TAB:取消制表符

CTRL + U:转小写

CTRL + SHIFT + U:转大写

CTRL + SHIFT + END:选择至文档末尾

CTRL + SHIFT + HOME:选择至文档末尾开始

SHIFT + END:选择至行尾

SHIFT + HOME:选择至行开始处

SHIFT + ALT + END:垂直选择到最后尾

SHIFT + ALT + HOME:垂直选择到最前面

CTRL + A:全选 CTRL + W:选择当前单词

CTRL + SHIFT + PAGE UP:选择至本页前面

CTRL + SHIFT + PAGE DOWN:选择至本页后面

CTRL + END:文档定位到最后

CTRL + HOME:文档定位到最前

CTRL + G:转到…

CTRL + K, CTRL + P:上一个标签

CTRL + K, CTRL + N:下一个标签

ALT + F10:调试-ApplyCodeChanges

CTRL + ALT+ Break:停止调试

CTRL + SHIFT + F9 :取消所有断点

CTRL + F9:允许中断

CTRL + SHIFT + F5:调试-重新开始

CTRL + J:列出成员

CTRL + PAGE DOWN:下一个视图