自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 线程与任务

线程线程与进程的区别: 进程:是计算机中已运行的实体。在面向线程设计的系统(当代多数系统)中,进程本身不是基本运行单位,而是线程的容器。线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。也是独立调度和分派的基本单位。一个进程可以由多个线程辅助执行。开启线程的三种方

2017-11-05 15:45:35 704

原创 特性和反射

特性特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。我们可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。元数据是什么?

2017-10-19 23:02:58 380

原创 LINQ集合操作

LINQ是一个用于操作集合的语法,它能够查询一个集合里的字段,并且能够分组、排序,除此之外还有其他的功能。它的语法规则和SQL语言非常相似。在一个集合中,我们想要得到集合里满足特定条件下的集合,通常情况下我们会用foreach循环来获取里面的集合。 首先我们先定义两个集合//武林高手集合class MartialArtsMaster { public int Id { g

2017-10-19 10:37:53 1707

原创 观察者设计模式——猫捉老鼠

观察者设计模式通过猫捉老鼠这个例子来弄清楚委托和事件并且对他们的用途有更深的认识。 在这里,猫是被观察者,老鼠是观察者。当观察者发生动作时,观察者对应的就会有相应的动作,比如猫开始移动了,老鼠就相应地都逃跑了。又比如在游戏中,被观察者是一个开始按钮,当它被点击的时候,观察者(美术资源、音乐资源、场景资源等)就会开始加载。猫捉老鼠首先我们定义一个Cat类class Cat {

2017-10-12 11:18:43 2307

原创 匿名方法、Lambda表达式和事件

匿名方法在前面我们知道委托可以指向一个或多个方法,当有一个方法只需要用一次并且很简短,例如:static int Test1(int arg1,int arg2) { return arg1 + arg2; }//使用委托指向这个方法static void Main(string[] args) { F

2017-10-09 17:12:14 427

原创 委托的应用——通用冒泡排序

学习过数据结构和算法的,都知道冒泡排序是如何实现的,它是从最前面两个数开始比较,如果前面的数比后面的大,就交换位置,以此类推,使数据完成从小到大的排序。但是在实际应用中,不可能是只给你一些整型的数据来让你排序,可能是给你一个类,里面有很多属性,我们需要根据其中的一个属性的大小来排序,所以我们需要使用委托,来进行数据的排序。我们可以举个最简单的的例子,假如在一个公司里有很多员工,我们需要根据他们的工资

2017-10-09 16:25:19 478 1

原创 委托

在前面我们说过委托的定义和作用,它可以指向有返回值和参数的方法。 在C#中,系统内置(预定义)了两个委托类型,分别是Action委托和Func委托,这两个委托类型可以满足编程中大部分需求,不需要我们自己去定义新的委托类型。Action委托:它可以指向一个没有返回值,没有参数的方法。但是它可以通过泛型来指向一个没有返回值,但是有参数的方法,最多支持有16个参数的方法。 Action委托示例:cla

2017-10-04 11:24:14 301

原创 正则表达式

正则表达式是计算机科学的一个重要概念,它使用一种数学算法来解决计算机程序中的文本检索、匹配等问题,正则表达式语言是一种专门用于字符串处理的语言,在很多语言中都提供了对它的支持。 正则表达式的作用:检索:通过正则表达式,从字符串中获取我们想要的部分匹配:判断给定的字符串是否符合正则表达式的过滤逻辑 所以我们可以认为正则表达式表述了一个字符串的书写规则。正则表达式的书写规则:正则表达式是由普通

2017-10-02 14:45:26 255

原创 string和StringBuilder

在之前我们简单的介绍了string字符串的一些操作方法,有一点要知道的是,当我们修改string字符串时,实质上我们是在堆内存里,重新开辟了一个内存空间,将修改完的字符串放进去,再引用到这块内存,旧的内存空间则被GC回收。如果我们需要频繁地修改字符串,那这种重复开辟内存的方法就会影响效率,所以我们有个StringBuilder类,也能够创建一个字符串,但是用法和string不同StringBuild

2017-09-28 10:31:59 217

原创 使用泛型来创建我们自己的列表

在前面我们知道在C#中有一个List类,可以存储长度不限的数据。列表是使用了泛型来创建的,那我们可以通过泛型来创建自己的一个列表,这样我们能够对泛型和列表有个更深刻的了解。首先,我们知道列表其实就是一个数组,只不过构造的时候不需要指定长度,那么我们首先要定义一个泛型数组和其中元素个数的变量。class MyList<T> where T:IComparable { priva

2017-09-27 10:40:46 285

原创 泛型

泛型是什么 泛型是程序设计语言的一种特性,它通过参数化类型来实现在同一份代码上操作多种数据类型。利用参数化类型将类型抽象化,从而实现灵活的复用泛型类 当定义一个类的时候,这个类的某些字段的类型可以是不确定的,这个类就叫做泛型类,这些类型可以在类构造的时候确定。 例如:class ClassA<T> { private T a; private T b;

2017-09-26 09:38:02 169

原创 泛型之列表的创建和使用

在前面,我们需要存储很多类型一样的数据的时候,我们一般都使用数组来存储并且管理,但是数组有个缺点就是数组的大小是固定的,那么当我们不确定数据的个数的时候,该怎么存储呢? 我们可以使用集合类来进行存储数据,列表List就是集合类的一种。我们可以使用列表很方便的添加、删除数据以及其他的操作。列表的创建 列表可以存储任何类型的数据,在创建列表对象的时候,我们首先要指定要创建的这个对象要存储什么类型的(

2017-09-25 22:18:14 525

原创 定义和实现接口

接口在继承中我们讲到了接口,那么如何去定义和实现一个接口呢?定义一个接口在语法上和定义一个抽象类完全相同,但是不允许提供接口中任何成员的实现方式。 语法规则定义接口(飞翔)public interface IFly{ public void Fly();}实现接口public class Type1Enemy:IFlyHandler{}如果有同时继承多个接口,那么就用逗号隔开接口名。

2017-09-25 20:10:09 4435

原创 派生类的构造方法以及修饰符的作用

派生类的构造方法在学习如何定义类的时候,我们学会了定义类之后如何使用构造方法来初始化对象。在继承关系中至少有两个类,那么是使用父类还是子类的构造方法来初始化对象呢?在子类中调用父类的默认构造方法(无参)public class MyDerivedClass{ public MyDerivedClass:base(){ //do something }}在这里base

2017-09-25 19:47:06 470

原创 抽象类与密封方法

抽象类在上一篇文章里,我们知道基类里的函数能够被重写,那么要是在一个程序里,他的函数在每个子类里全部都要被重写,该基类的函数可不可以不去实现,只定义一个函数呢? 我们可以定义一个抽象函数,抽象函数只有函数定义没有函数体,可以说抽象函数本身也是虚拟的virtual(只有函数,没有函数体实现)当一个类里有抽象函数的时候,这个类也必须是抽象类,抽象类不能实例化,但是抽象类可以同时有普通函数和抽象函数。

2017-09-25 17:27:37 308

原创 关于继承里的虚方法和隐藏方法

在继承里,我们知道子类拥有父类的方法,那么如果子类需要的方法和父类的有一些区别,想要修改一下要怎么做呢?C#里有两种重写的方法:虚方法和隐藏方法。虚方法 在基类中,将函数声明为virtual,这个函数就叫做虚方法,可以在任何派生类中重写该函数。该函数不能有private、static、abstract关键字。 语法规则class MyBaseClass{ public virtual s

2017-09-24 13:00:43 589

原创 面向对象编程-继承

继承在前面我们学习了如何去定义类,用类当做模板来声明我们的数据。那么当我们的程序需要很多个类,但是这些类有很多相似的字段和方法,我们也要一个个重新去定义吗? 我们可以使用继承,将相同的方法和字段放在一个基类里,有不同的字段或方法就写在派生类,继承基类。实现继承 表示一个类型派生于一个基类,它拥有该基类的所有成员字段和函数。在实现继承中,派生类型采用基类的每个函数的实现代码,除非在派生类的定义中指

2017-09-24 11:16:58 173

原创 匿名类型&&堆和栈

匿名类型在前面的代码中,我们创建变量(对象)的时候,都指定了变量的类型,但是我们也可以不去指定类型,这个就叫做匿名类型。我们可以使用var声明一个匿名类型,匿名类型初始化的时候,这个变量的类型就被确定下来了,并且之后不能够在被修改。static void Main(string[] args) { int i = 100; var j

2017-09-23 15:56:09 440

原创 面向对象编程-定义类

为什么使用面向对象编程?程序员为了让程序更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。面向对象编程也叫OOP编程。类类创建的变量叫做对象,实际上类是创建对象的模板,每个对象都包含数据,并提供了处理好访问数据的方法。类定义了类的每个对象(称为实例)可以包含什么数据和功能。那如何去创建一个类?clas

2017-09-22 17:37:59 602

原创 关于VS中的错误处理和调试

关于错误和调试的基本概念错误 语法错误:比如变量名错误等,导致编译器无法编译,编译器能够实时报错//语法错误,变量名出错 int temp = 235; tem = 43; 语义错误(逻辑错误):逻辑在某些方面有瑕疵,会导致结果和预想中的不一样,但是能够编译成功,编译器不会报错//逻辑错误,结果与预期的不同 int

2017-09-22 11:33:06 5509

原创 广义表与多重链表的概念

广义表广义表是线性表的推广。 对于线性表而言,n个元素都是基本的单元素,而在广义表中,这些元素不仅可以是单元素,也可以是另一个广义表。 通俗的讲,在广义表中的元素,也可以是一个线性表。 如何去定义一个广义表?typedef struct GNode{ int Tag; //标志域,0表示结点是单元素,1表示结点是广义表 union{ /

2017-09-20 10:29:55 2642

原创 函数的重载||委托类型的定义

函数的重载在类下面定义两个相同的函数,分别修改两个函数的返回类型和参数类型,这是函数重载的方法。static int MaxValue(params int[] array) { Console.WriteLine("这里是int方法"); int max = 0; for(int i = 1; i < arra

2017-09-17 21:21:20 350

原创 函数的定义与调用&&参数数组

函数的定义与调用一个最基础的C#程序结构是这样的using System;using ....;namespace xxx{ class Program { static void Main(string[] args) { } }}当我们要定义函数的时候,要在类下定义函数namespace xxx{ class

2017-09-17 17:00:34 1391

原创 线性表的顺序存储实现和链式存储实现

线性表是由同类型数据元素构成有序序列的线性结构,表中元素个数称为线性表的长度,线性表没有元素的时候称为空表,表起始位置称表头,结束位置称表尾。线性表有数据对象集和操作集 数据对象集:线性表是n个元素构成的有序序列 操作集:线性表L属于List,整数i表示位置,元素X属于ElementType线性表基本操作主要有 List MakeEmpty(): 初始化一个空线性表 Element

2017-09-09 10:01:05 819

原创 数组的遍历和字符串的操作

数组的遍历遍历数组有三种循环方式for循环int i = 0;int[] scores = { 12, 16, 2, 6, 7, 23, 7, 4, 7 };Console.WriteLine("for循环遍历数组");for(i = 0; i < scores.Length; i++){ Console.WriteLine(scores[i]);}while循环while

2017-09-08 14:03:01 2820

原创 数据的显式隐式转换以及枚举、结构体和数组

数据的显隐式转换显式转换又称为强制转换,是由数值范围大的数据类型转换成数值范围小的数据类型,之所以需要强制转换,是因为范围大的数据转换成范围小的数据的时候,可能会造成溢出,编译器无法通过。相对应的隐式转换则是由数值范围小的数据类型转换成数值范围大的数据类型,因为范围小,所以不用担心数值超出该数据类型的数值范围。byte myByte = 123;int myInt = myByte; //隐式转换

2017-09-08 13:49:58 782

原创 什么是数据结构和算法

什么是数据结构数据结构没有一个准确的定义。 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 ——百度百科 数据结构是数据对象,以及存在于该对象的实例和组成实 例的数据元素之间的各种联系。 ——《数据结构、算法与应用》数据结构的逻辑结构有四种:集合线性结构树形结构图形结构采用什么结构由数据的类型和数量决定,采用正确的结构才存

2017-09-08 11:05:24 330

转载 条件语句和循环语句

条件语句if语句有三种用法1.if(表达式){...}    //如果表达式的值为真,则执行括号内的复合语句2.if(表达式){语句1}else{语句2}         //如果表达式的值为真,则执行语句1,否则执行语句23.if(表达式){语句1}else if{语句2}else if{语句3}...else{语句m}        //如果

2017-09-02 11:30:37 5045

转载 关于数学运算符的自加和自减

操作数的自加自减共有四种情况:i++,i--,++i,--i在没有赋值的情况下首先++和--不论在操作数的前面和后面,结果总是会是操作数加1或减1在赋值的情况下int i = 45;int res1 = i++;int res2 = ++1;Console.WriteLine(res1+":"+res2);//res1结果为45,res2结果为47由此可见操作数和运

2017-08-28 23:25:30 375

转载 C#简单数据类型

整数类型byte:0 -- 255int:-2147483648 -- 2,147,483,647long:-923,372,036,854,775,808 -- 923,372,036,854,775,807short:-32,768 -- 32,767浮点类型float:-3.4 x 10^38 -- -3.4 x 10^38doub

2017-08-28 11:21:04 346

转载 格式化字符串

格式化字符串对字符串格式化的输出:Console.WriteLine("两个数相加{0}+{1}={2}",4,6,10);多重标记Console.WriteLine("Three integers are {1},{0} and {1}",3,5);但是标记不能引用超出替换值列表长度以外位置的值Console.WriteLine("Two inte

2017-08-28 11:19:55 143

转载 Main方法,语句,块的定义

Main方法1.每个C#程序必须有一个Main方法2.每个C#程序可执行起点在Main中的第一条指令3.Main方法最简单的语句:static void Main(){}语句语句是描述一个类型或告诉程序去执行某个动作的源代码指令,语句以分号结束块1.块是由一个大括号包围起来的0条或多条语句序列,在语法上相当于一条语句2.某些特定的程序

2017-08-28 11:19:22 718

转载 标识符

要点1.字母和下划线可以放在任何位置2.数字不能放在首位3.@字符只能放在首位4.标识符不能有“.”5.标识符不能和关键字重复C#命名规范Camel命名法首个单词的首个字母小写,其余单词的首个字母均大写。(enemyHP)Pascal命名法每个单词的首字母都大写,如果是英文单词的缩写则全部使用大写。(EnemyHP、H

2017-08-28 11:18:33 202

转载 C#简单程序的结构分析

引入命名空间程序头部使用using关键字标识的代码定义命名空间使用namespace关键字标识的代码定义类class Program定义一个Main方法static void Main(String[] args){}方法体在方法里写的语句为方法体

2017-08-28 11:16:06 251

转载 C#和.NET框架

文章有C#初级篇、中级篇、高级篇、数据结构篇,该系列文章均是我在泰课网上学习所做的笔记,并非原创。

2017-08-28 11:04:50 261

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除