C#
文章平均质量分 67
WhiteJunior
这个作者很懒,什么都没留下…
展开
-
Debug和Release的区别
- bin是放最终代码的目录 。- obj就放中间代码的目录release和debug是不同的运行方式。- debug会增加调试代码,方便调试。- 调试完后,用release版本发布,没有调试代码,减小程序体积,加快执行速度。原创 2019-03-16 22:48:18 · 19354 阅读 · 0 评论 -
C#中创建自定义特性
自定义特性特性实质上是一个类,想要构建一个用户自定义特性,只需要创建一个特性类即可。特性类的命名一般以Attribute结尾特性类需要继承自System.Attribute特性类一般声明为sealed,因为特性类一般不需要被继承特性类一般用来表示目标结构的一些状态(定义一些字段或属性,一般不定义方法) 定义特性[AttributeUsage(AttributeTargets...原创 2018-06-05 11:00:11 · 4025 阅读 · 0 评论 -
C#中的Socket编程-TCP服务器端
TCP服务器class Program { static void Main() { //1,创建一个Socket //第一个参数表示一个内网,第二个参数表示以流的形式通信,第三个表示用TCP协议通信 Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType....原创 2018-06-11 20:04:52 · 1333 阅读 · 0 评论 -
C#中的DebuggerStepThrough特性
DebuggerStepThrough特性当我们在进行单步调试代码的时候,常常希望调试器不要进入某些方法。我们只想执行该方法,然后继续调试下一行。 DebuggerStepThrough特性会告诉编译器在执行目标代码时不要进入该方法调试。有些方法规模很小并且毫无疑问是正确的,在调试的过程中反复单步调试是非常没有必要的。 但是,要小心使用该特性,不要排除掉可能出现bug的代码。该特性是用...原创 2018-06-04 18:53:30 · 3574 阅读 · 4 评论 -
C#中的调用者信息特性
调用者信息特性调用者信息特性可以访问文件路径,代码行数,调用成员的名称等源代码信息。 这三个特征名称分别为: CallerFilePath,CallerLineNumber, CallerMemberName 这三个特性只用用于方法中的参数//这三个参数是系统进行定义和传递的static void PrintOut(string str, [CallerFilePath]s...原创 2018-06-03 10:49:38 · 1498 阅读 · 0 评论 -
C#中的Conditional特性
Conditional特性这种特性允许我们包括或者取消特定方法的所有调用。为方法声明应用Conditional特性并把编译符作为参数来说使用。 定义方法的CIL代码本身总是会包含在程序集中,只是调用部分的代码会被插入或忽略。(根据宏是否被定义而决定)static void Test1(){ Console.WriteLine("Test1");}static void Te...原创 2018-06-02 19:06:29 · 3014 阅读 · 2 评论 -
C#中的Obsolete特性
特性特性(attribute)是一种允许我们向程序的程序集增加元数据的语言结构。它是用于保存程序结构信息的某种特殊类型的类。Obsolete特性一个程序可能在其生命周期中经历多次发布,而且很可能延续多年。在程序生命周期的后半部分,程序员经常需要编写类似功能的新方法替换老方法。处于多种原因,你可能不再使用哪些调用过时的旧方法的老代码。而只想用新编写的代码调用新方法。旧的方法不能删除,...原创 2018-06-02 18:53:05 · 13128 阅读 · 2 评论 -
C#中的事件
事件事件(event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。 事件的定义: 事件(event)是类或者对象对其他类或者对象通知发生的事情的一种特殊签名的委托。 事件的声明: 在一个委托类型前面加上关键字event,这个时候所声明出的委托类型变量就成为事件。public event 委托类型 事件名;事件使用event关键字来进行声明,...原创 2018-05-08 11:05:07 · 259 阅读 · 0 评论 -
C#中的Lambda表达式
Lambda表达式其实质上是用来代替匿名方法的。 因此一个Lambda表达式也是定义了一个方法,只是形式上比匿名方法简单。 只要有委托类型的地方就可以使用Lambda表达式。 Lambda运算符:=> 匿名方法:Func<int, int, int> plus = delegate(int arg1, int arg2){ return arg1 + a...原创 2018-05-08 10:39:07 · 1480 阅读 · 0 评论 -
C#中的匿名方法
匿名方法匿名方法本质上还是一个方法,只不过没有名字。 任何使用委托变量的部分,都可以使用匿名方法赋值。//定义匿名方法static main(){ //匿名方法需要使用delegate关键字来进行声明 Func<int, int, int> plus = delegate(int arg1, int arg2) { return...原创 2018-05-08 09:55:24 · 347 阅读 · 0 评论 -
C#中对结果进行分组操作——into groups
对结果进行分组var res = from s in skillList join m in masterList on k.WorkAge equals m.Age into groups orderby goups.Count() select new{skill = s, count = groups.Count()}; 需要注意是,master是多的...原创 2018-05-14 10:33:45 · 2385 阅读 · 0 评论 -
C#中LINQ的Join on联合查询
Join on联合查询join后面跟所要连接的集合,on后面跟的是连接条件。var res = from m in masterList join s in skillList on m.Age equals s.WorkAge select new{master = m, skill = s};var res = from m in masterList jo...原创 2018-05-14 10:03:04 · 9618 阅读 · 0 评论 -
C#中的多播委托
多播委托可以引用的多个函数的委托称为多播委托。 example:static void Test1(){ Console.WriteLine("Test1");}static void Test2(){ Console.WriteLine("Test2");}static void Main(){ //多播委托 Action a = Test...原创 2018-05-07 11:06:59 · 2722 阅读 · 0 评论 -
C#中LINQ对查询结果的排序
查询结果排序var res = from m in masterList where m.Level > 8 && m.Age > 50 orderby m.Level //默认按照从小到大进行排序 select m.Name;var res = from m in masterList where m.Leve...原创 2018-05-13 13:12:36 · 7589 阅读 · 0 评论 -
C#对冒泡排序的扩展和实例
冒泡排序的扩展冒泡排序原理是,对一个数组进行n-1次遍历,在每一次的遍历中,将最大的数字放到最后。 另一种表达形式则是: 定义一个bool变量,如果在一次数组遍历中,没有产生数字的交换,则bool置为true;否则就继续对整个数组再次进行遍历。但是这样的排序只能针对于数字形式而不能对普通的数据进行排序。实例功能: 利用salary来对employee进行排序。 这里,定...原创 2018-05-06 14:59:19 · 189 阅读 · 0 评论 -
C#中的Socket编程-TCP客户端
TCP客户端using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace TCP_client_communic...原创 2018-06-12 12:48:49 · 7014 阅读 · 0 评论 -
C#中进程和线程的概念
进程和线程举一个简单的例子:计算机的核心是CPU,它承担了所有的计算任务。它就像是一个工厂,时刻在运行。如果工厂的电力有限,一次只能给一个车间使用,也就是说在一个车间开工的时候,其他车间就必须人停工。背后的含义就是,单个CPU一次只能运行一个任务。(多核CPU可以同时运行多个任务)进程就好比是工厂的车间,它代表着CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,而其他进程处...原创 2018-06-06 10:36:36 · 2469 阅读 · 1 评论 -
const、readonly与sealed
const为静态常量,readonly为动态常量,sealed为密封原创 2019-03-11 00:09:41 · 978 阅读 · 0 评论 -
C#中的标签语句与goto语句
标签语句标签语句由一个标识符后面跟一个冒号,再跟一条语句所组成,形式如下:Identifier : Statement标签语句在执行时,标签相当于完全不存在,仅仅执行Statement的部分。给语句添加一个标签,允许控制从代码的其他的部分转移到该语句。标签语句只允许用在块内部。标签标签有其自己的声明空间,因此,标签语句中的标识符可以是任何有效的标识符,包括那些...原创 2018-07-12 21:13:44 · 10350 阅读 · 2 评论 -
C#中的争用条件与死锁问题
争用条件对于两个异步执行的线程,如果同时请求同一个对象,会造成读取数据出现问题。 首先,定义一个类:class MyThreadObject { private int state = 5; public void ChangeState() { state++; if (st...原创 2018-06-10 12:46:48 · 941 阅读 · 0 评论 -
C#中的任务其他知识点
任务的其他知识连续任务如果一个任务t1的执行是依赖于另一个任务t2的,那么就需要这个任务t2执行完毕后再开始执行t1.这个时候需要使用连续任务。static void DoFirst() { Console.WriteLine("do in task : "+Task.CurrentId); Thread.Sleep(3000); }...原创 2018-06-09 12:16:46 · 261 阅读 · 1 评论 -
C#中的线程开启方式4-任务
任务开启第一种方式class Program { static void ThreadMethod() { Console.WriteLine("任务开始"); Thread.Sleep(2000); Console.WriteLine("任务结束"); } static void Main() {...原创 2018-06-09 11:04:43 · 478 阅读 · 0 评论 -
C#中的线程开启方式3-线程池
线程池创建线程需要时间。如果有不同的小任务需要完成,则可以事先创建许多的线程,对应完成这些任务时发生的线程请求。这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。 而对应的这个线程池,不需要用户去自己创建。系统中已经有一个ThreadPool类来管理线程。 这个类会在需要时增减池中的线程的个数,直到达到最大的线程数。 池中的最大线程数是可配置的。在双核CPU中,默认设置为102...原创 2018-06-08 22:18:30 · 2946 阅读 · 0 评论 -
C#中线程的其他概念
后台线程和前台线程只有一个前台线程在运行,应用程序的进程就在运行。如果多个前台线程在运行,但是Main方法结束了,应用程序的进程仍然是运行的,直到所有的线程完成其任务为止。 在默认的情况下,用Thread类创建的线程是前台线程。线程池中的线程是后台线程。 在用Thread类创建线程的时候,可以设置IsBackground属性,表示它是一个前台线程还是后台线程。后台线程使用的地方: 例...原创 2018-06-08 11:10:59 · 140 阅读 · 0 评论 -
C#中线程的开启方式2-通过Thread类
通过Thread类开启线程普通的静态方法class Program{ static void DownloadFile() { //通过CurrentThread.ManagedThreadId获取当前的线程ID Console.WriteLine("开始下载:"+Thread.CurrentThread.ManagedThreadId);...原创 2018-06-07 22:51:08 · 223 阅读 · 0 评论 -
C#中的Assembly程序集类
Assembly程序集类class MyClass{ private int id; private int age; public int number; public string Name1{get;set;} public string Name2{get;set;} public string Name3{get;set;} ...原创 2018-05-31 13:58:23 · 2666 阅读 · 0 评论 -
利用Unity实现一个简单的TCP通讯工具
在这样的一个简单的通讯工具中,首先要实现的是两个模块:服务器端(server)客户端(client)其中server端,利用VS写一个控制台程序来实现。 client端则利用Unity3D软件来实现。使用的语言都是C#。1, SeverServer端主要有两个类,一个Program类为主类,Client类不是客户端,是专门处理用户端的发送信息的类。 在Progra...原创 2018-06-21 15:39:06 · 3902 阅读 · 1 评论 -
C#中检测委托线程的结束
已知可以通过写一个while的死循环来检测线程是否结束(不要用) 第二种方式为:等待句柄class Program{ static int Test(int , string str){ Console.WriteLine(&amp;quot;test&amp;quot;+i+str); Thread.Sleep(100);//让当前线程休眠(即模拟下载过程),单位是ms ...原创 2018-06-06 23:37:48 · 1961 阅读 · 0 评论 -
C#中线程的开启方式1-异步委托
通过委托开启线程BeginInvokeclass Program{ static void Test(int , string str){ Console.WriteLine("test"+i+str); } static void Main(){ //通过委托来开启线程 Action&lt;int,stri...原创 2018-06-06 17:31:22 · 580 阅读 · 1 评论 -
C#中的反射和特性
元数据与反射程序是用来处理数据的,文本和特性都是数据;而程序本身(类的定义和BLC中类)这些也都是数据。有关程序以及其类型的数据被称为元数据(metadata),他们保存在程序的程序集中。程序在运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据或者其它程序集的元数据的行为称为反射。Type类首先,对于预定义的类型(int,long,string等)、...原创 2018-05-30 15:03:56 · 1232 阅读 · 0 评论 -
C#中的量词操作符
量词操作符Any只要有一满足条件就直接返回true;全都不满足则返回false。bool res = masterList.Any(m=>m.Age >30);All只有所有的元素都满足条件才会返回true;否则直接返回false。bool res = masterList.All(m=>m.Age >30);...原创 2018-05-30 13:43:42 · 237 阅读 · 0 评论 -
C#中的Func委托
Func委托Func委托引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。Func<out TResult>Func<in T,out TResult>Func<in T1,in T2,...,in T16, out TResult> example:static int Test1(){ re...原创 2018-05-06 13:09:52 · 19535 阅读 · 2 评论 -
C#中LINQ的联合查询
联合查询顾名思义,也就是将两个集合结合在一起进行查询的办法。表达式写法:var res = from m in masterList from s in skillList where m.Age == s.WorkAge select new {master = m, skill = s};var res = from m in master ...原创 2018-05-12 15:50:15 · 7583 阅读 · 0 评论 -
C#中的虚方法与隐藏方法
虚方法将一个基类函数声明为virtual,就可以在任何派生类中重写该函数。class MyBaseClass{ public virtual string VirtualMethod(){ return "Method is called in base class." } }在派生类中进行重写该函数时,需要使用override关键字...原创 2018-04-06 14:35:29 · 1881 阅读 · 1 评论 -
C#中的继承
继承继承的种类实现继承 表示一个类派生自一个基类型,它拥有该基类型的所有成员字段和函数。在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的第一种指定重写某个函数的实现代码。 在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共能力时,这种类型的继承非常有效。接口继承 表示一个类型只继承了函数的签名,没有继承任何实现代码。在需要指定该类型具有某些可用的...原创 2018-04-06 13:19:51 · 232 阅读 · 0 评论 -
C#中的栈与堆-程序运行时的内存区域
栈与堆内存空间可以分为两种:栈与堆栈空间比较小,但是读取速度较快。 栈的特征: 数据只能从栈顶进行插入和删除。 将数据放入栈顶称为入栈(push) 将栈顶删除数据称为出栈(pop) 先进后出堆空间比较大,但是读取速度较慢。 堆的特征 堆里的内存能以任意顺序存入和移除。Garbage CollectionCLR是公共语...原创 2018-04-04 15:28:14 · 945 阅读 · 0 评论 -
C#中的匿名类型
匿名类型在创建变量(对象)时,一般需要指定类型。 但是在C#中,也可以不去指定类型。这个就是匿名类型。关键字为var。 在使用var进行匿名类型的声明时,在进行初始化后,该变量的类型就确定下来,而且之后不可以再进行修改。eg:var var1 = 34; //var1为整型var var2 = "hello"; //var2为字符串var a1 = new myC...原创 2018-04-04 13:49:56 · 328 阅读 · 0 评论 -
C#中属性的定义
属性的定义定义结构:public int MyIntProp{ get{ //get code } set{ //set code } }定义属性需要名字和类型。属性包含两个块:get块和set块。访问属性和访问字段一样,当取得属性的值得时候,就会调用属性中的get块,因此ge...原创 2018-04-03 21:44:09 · 11385 阅读 · 2 评论 -
C#中列表List的创建与使用
集合类 列表List当我们有很多类型一样的数据时,可以使用数组来进行存储并管理,但是这样的缺点是数组的大小是提前给定的、是固定的。 如果我们有许多类型一样但数量不定的数据,我们可以使用集合类来进行管理——例如列表List。我们可以使用列表List很方便的添加数据,删除数据以及其他的一些数据操作。 创建方法1:List<int> scoreList = new List&...原创 2018-04-15 19:45:37 · 67105 阅读 · 3 评论 -
C#中面向对象的编程--类
面向对象的编程定义: 为了让编程更加的清晰,把程序中的功能进行模块化的划分,每个模块提供特定的功能,并且每个模块都是孤立的,这种模块化的编程提供了非常大的多样性,大大增加了重用代码的机会。 简单来说,面向对象编程(OOP)就是结构化编程,对程序中的变量结构划分,让编程更为清晰。类 类是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。 类定义了类的每个对象(称为实例...原创 2018-04-02 16:58:41 · 204 阅读 · 0 评论