C#基础内容记录

目录

一、名词解释

1.1 关键字

1.2 命名空间 namespace

1.3 引用 using

1.4 枚举 Enum

1.5 访问修饰符

1.6 接口类

1.7 多态

1.8 LINQ

1.9 反射

1.10 Type 类

1.11 sealed关键字

1.12 对象,类,构造方法

1.13 构造方法

1.14 创建一个对象

1.15 托管堆

1.16 公共语言运行库CLR(Commnon Language Runtime)

1.17 .net的对象生命周期

1.18 栈内存

1.19 堆内存

1.20 方法签名

二、委托 Delegate

2.1 什么是委托

2.2 定义委托的语法

2.3 多播委托

三、事件 Event

四、特性 attribute

五、进程和线程

5.1 什么是线程

5.2 关系

5.3 开启线程

5.4 前台线程和后台线程

5.5 线程池

5.6 任务的层次关系

6.7 锁 lock


一、名词解释

1.1 关键字

对编译器有特殊意义的预定义保留的标示符。

1.2 命名空间 namespace

namespace 关键字用于声明包含一组对象的作用域,可以使用命名空间来组织代码元素并创建全局唯一类型。

1.3 引用 using

主要有三个用途:

用语句定义一个范围,在范围内释放对象。

用指令为命名空间创建别名,或导入在其他命名空间中定义类型。

using Static 指令导入单个类的成员。

1.4 枚举 Enum

用于定义具有一组特定值得 数据类型,以 Enum 关键字声明。

1.5 访问修饰符

是关键字,用于指定成员或者类型已声明的可访问性。

如:

public: 访问公开的 不受限制

protected:访问包括类或者派生自包含类的类型 (简而言之就是 保护)

internal:访问限于当前程序集 (内部)

protected internal:访问限于当前程序集或者派生自包含的类型

private:访问限于包括类 (私有)

private protected:访问限于 包含类或者当前程序集中派生自包含的类型

1.6 接口类

接口里的方法不能有修饰符,默认的访问属性是 Public

接口中不能有函数体和构造方法,不能包含实例字段,不能被实例化。

结构之间可以继承,还可以多继承;但是接口不能继承与类,但是类可以继承接口。

接口里的方法被继承类重写时,不需要 关键字 overide 。

一个类可以同时继承一个类,并可以实现多个接口。

1.7 多态

实现方式

虚方法:在父类的方法面前加关键字 virtual ,子类重写该方法时在方法名前面加上 Override 关键字。

抽象类:在类前边加 abstract ,方法面前也要加 abdtract ,抽象方法不能有函数体。

抽象类的特点: 可以有字段,可以有非抽象方法。

1.8 LINQ

支持,C# VB.NET ... others(其他语言)

LINQ Providers 存在于内存中:

LINQ to Objets LINQ to XML LINQ to SQL LINQ to DataSet LinQ to Entitles

1.9 反射

程序是用来处理数据的,文本和特性都是数据,二维码程序本身(类的定义和BLC中的类)这些也是数据。

有关程序及类型的数据被称为 元数据(metadata) ,他们保存在程序集中。

在程序运行时,可以查看其他程 序集或者其本身的元数据,一个运行的程序查看本身的元数据或者其他程序的集的元数据的行为叫反射。

1.10 Type 类

预定义类型(int long 和 string 等),BCL中的类型(Console,IEnumerble等)和自定义类型(MyClass,MyDel等)。每种类型都有自己的成员和特性。

BCL 声明了一个叫做Type 的抽象类,他被设计用来包含的特性,使用这个特性让我们获取程序使用的类型信息。

由于Type 是抽象类,抽象类是不能被实例化的,所以该类(Type)是不能被实例化的。

1.11 sealed关键字

当对一个类的修饰符,该修饰符会阻止其他类从基础该类。 ​ 能够允许类从基类继承,并防止他们重写特定的虚方法或者虚属性。 ​ sealed 是对虚方法或者虚属性的,也就是同 override 一起使用,如果不是虚方法或者虚属性会爆出错: cannot be sealed because it is not an override

1.12 对象,类,构造方法

对象:万物皆对象,具有具体的特征和行为的事物。

类:物以类聚,具有相同特征的行为的一组对象的集合。

类和对象的关系:先写类在写对象,在 new 对象 。

类在这个时候就相当于对象的模板。

1.13 构造方法

构造方法久和和类名一致的一个方法,构造方法中 没有 void(类修饰符)。

如果自己没有写构造方法,系统会给一个默认的无参构造方法,但是你最近写了构造方法,那么系统就不会给无参的构造方法。如果要写无参构造方法还是要自己手动写上。

1.14 创建一个对象

创建一个类的对象 = 调用这个类的构造函数初始化对象,类名()这个是构造函数,用于初始化。

类名 对象名 = new 类名 (参数列表)

在使用关键字(new)创建一个对象的时候 ,首先对象资源被分配在托管堆中,然后 new 会返回一个指向腿上的对象的引用 ,而不是对象本身。

对象名:如果在方法作用域中将引用变量声明为本地变量,引用变量保存在栈内,以供方便程序以后使用。

new 出来的对象都会在 托管堆中管理

1.15 托管堆

简而言之,就是 CLR (Common Lanauage Runtime),对象的实例化结束以后,GC(垃圾回收器)将会在对象不在需要时将其销毁。

1.16 公共语言运行库CLR(Commnon Language Runtime)

是托管代码 执行核心中的引擎。运行库为托管代码提供各种服务,如跨语言集成、代码访问安全性、对象生存期管理、调试和分析支持

1.17 .net的对象生命周期

程序在计算机上跑着,就难免占用内存资源来存储的程序运行中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存。

1.18 栈内存

通常使用的场景是:对 存取速度要较高,且数据量不大 。

例子

典型的栈内存使用的例子就是函数栈,每一个函数被调用时都会被分配一块内存,这块内存被称为栈内存,以先进后出的方式存取数据,在函数执行的过程中不断往函数中压入(push)数据(值类型如: int 、floal、对象的引用...),函数执行完后又将函数栈中的数据逐个弹出(pop),由于以操作栈的形式来存取,所以访问速度快。

1.19 堆内存

堆内存中存放大规格的数据(如对象资源),这些数据是不适合存放栈中饿,栈中的空间容量有限。

堆内存比栈内存有点就在这里,容量大。

但是缺点也显而易见,就是堆中的数据量较大,在存取内存数据现对于栈中,是非常满的。

1.20 方法签名

计算机程序包括许多使人工任务自动化算法,这些程序分成小的模块组件,这些组件被称为和函数,每个方法都有一个特定的格式来描述他在程序中引用,方法签名是方法的形式定义。它提供了对该功能的高级描述。

二、委托 Delegate

2.1 什么是委托

如果我们要把 方法 当做参数来传递,就需要用到委托。是一个类型,这个类型可以赋值一个方法的引用。

在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象。在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编译器我们这个委托可以指向那些类型的方法,然后,创建该委托的实例。

2.2 定义委托的语法

delegate void intMethodlnvoker(int x);

其中 void intMethodlnvoker(int x); 方法的签名

定义了一个委托叫做IntMethodlnvoker(), 这个委托呢 ,只能指向其 定义委托 中的参数和类型,比如 IntMthodlnvoker() 这个委托 只能指向 类型为 Void 和 有一个类型参数为 int 。

2.3 多播委托

多播委托可以包含多个方法,使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法结果,一般我们把多播委托的返回类型声明为 void。

Action action = Test1;

action2 += Test2;

action2 -= Test1;

ps:多播委托包含一个逐个调用集合,如果通过委托调用的其中一个方法抛出异常,整个迭代就会停止。

三、事件 Event

事件就是建立在委托的支持之上的。

事件对象用于(向系统中的所有相关组件)广播已发生事情的一种方式,任何其他组件都可以订阅事件,并在事件引发时得到通知。

事件(event)基于委托,为委托提供一个发布/订阅机制,我们可以说是 其他类或者对象 向其他类发生通知的事情时的 一种具有特殊签名的委托。

事件不能在类的外部触发,只能在内部触发 。

事件与委托的关系:

事件是一种特殊的委托,或者说是一种受限制的委托,可以说是委托的一种特殊使用,只能 +=, -= 操作 ,在本质上是一个东西。

event ActionHandlier Tick; 编译建立一个私有的委托示例,如: 当我们使用 += 的时候,这个委托 会调用 add ;remove 的时候 -= 方法 ...

委托常用来表达回调 , 事件表达外发接口。

委托对象三个重要字段是 Pthis,f_ptr , pnext ,也就是被通知对象引用,函数指针/地址,委托链表的下一个委托节点。

四、特性 attribute

特性是一种允许我们向程序的程序集 添加元数据语言结构,它是用于保存程序结构信息的某种特殊类型的类

将应用了特性的程序结构叫目标

设计用来获取和使用元数据的程序(对象浏览器)叫做特性的消费者

.net 预定了很多特性,我们也可以声明自定义特性。

更多特性

ClSCompliant 声明可公开的成员应该被编译器检查是否符合 CLS。兼容程序集可以在被任何 .net 兼容的语言中使用

Serializable 声明结构可以被序列化

NonSerialized 声明结构不可以被序列化

DLLImport 声明是非托管代码实现的

WebMethod 声明方法应用被作为XML Web 服务器的一部分暴露

AttributeUsage 声明特性能应用到声明类型的程序结构。讲这个特性应用到特性声明上

五、进程和线程

5.1 什么是线程

线程是一个可执行路径,它可以独立于其他 线程 执行

每个线程都在操作系统的进程(Process)内执行,而操作系统进程提供了程序独立的环境

单线程应用,在进程的独立环境里只跑一个线程,所以该线程拥有独占权

多线程应用,单个进程中会跑多个线程,它们会共享当前的执行环境(尤其是内存)。

例子:进程 相当于 一个工厂,而 线程 就相当于工厂中的 工人 。

5.2 关系

一个进程可以包括多个线程。

进程的内存空间是共享的,每个线程都可以使用这些共享空间。

一个防止其他人进入的简单方法,就是在门口外加一把锁,先到的人锁上门,后边到的人看到就会在门口排队,等里边的人把锁打开后在进去,这就叫互斥锁(Mutualexclusion 简写 Mutex),防止多个线程同时读写某一块内存区域。

5.3 开启线程

Invoke 和 BeginInvoke 一个导致工作线程等待,而另外一个则不会。

5.4 前台线程和后台线程

前台线程

在运行,应用程序的进程就都在运行,如果多个前台线程在运行,但是Main方法结束啦,应用程序的进程仍然是运行的,直到所有的前台线程完成其任务为止,如果要判断一个应用程序是否还在运行,那就判断那个程序的前台线程是否还在运行。

后台线程

在关闭应用的程序的时候,后台线程也就会被关闭。

线程的优先级

线程有操作系统调度,一个CPU同一时间只能做一件事情(运行一个线程中的任务),当有很多线程需要CPU去执行的时候,线程调度器会根据线程的优先级去判断先去执行哪一个线程,优先级相同的话,就需要使用循环调度规则,逐个执行每个线程。

控制线程

就是获取当前线程的状态,当我们通过 Start 方法调用之后,可以创建线程,但是调用之后,不会立即进入 Running(运行) 状态,而是先进入 Unstarted( 还没调用Start()方法状态 ),只有当操作系统的线程调度器选择了要运行的线程,这个线程的专题才会被修改成 Running(运行)。当我们想让线程进入休眠时,使用 WatiSleepJoin (阻止) 状态。

当我们先让线程停止的时候,我们就是用 Abort() 这个方法 停止线程,这个方法会在要终止的线程中抛出一个 ThreadAbortException 类型的异常,我们可以 TRY catch 这个异常来对线程结束前做一些清理工作。

join() 当我们想让线程睡眠,等待 其他线程 执行结束,如果继续运行下边的代码。

5.5 线程池

由于创建线程需要时间。

就是事先创建好的许多线程,在应完成这些任务时发出请求,这个线程最好需要更多线程时增加,在需要释放资源时减少。

我们不需要创建线程池,已经先创建好了一个 ThreadPool 类管理线程,这个类会在需要时增减池中线程的线程数,知道最大的线程数,池中的最大线程是可配置的,在双核cpu中,默认设置为1023个工作线程和1000个Vo 线程。也可以指定创建线程池应立即启动最小或者最大小线程数。如果有更多的作业要处理,线程池中的线程的个数也到了极限,最新的作业就要排队,等待其他线程完成任务。

线程池中如果都是后台线程,如果进程都结束了,所有的后台线程就会停止,不能改为前台线程。

不能给入池的线程设置优先权。

入池的现场只能用于时间简短的任务。如果线程要一直运行,建议使用Thread 类创建一个线程。

执行一些比较小的任务。

5.6 任务的层次关系

在一个任务中启动一个新的任务,相当于新的任务是当前任务的子任务,两个任务异步执行(同时执行),如果父任务执行结束但是子任务没有执行结束,他的状态会设置为 WaitingForChildrenToComplete (等待子任务结束) 只有子任务也执行结束,夫任务状态也变成 RunToCompltetion (从运行到结束)。

6.7 锁 lock

当线程发生争议的时候,我们可以使用锁来 暂定 另一个线程的运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值