C#
学习ing...
阿财继续努力
学习ing...
展开
-
C#应用 - 07.怎么实现TCP通信
实现TCP通信需要实例化TcpListener对象和TcpClient对象。首先实例化TcpListener对象并调用Start(),使其监听指定的IP地址和端口号,等待连接;然后实例化TcpClient对象并调用Connect(),使其连接指定的IP地址和端口号,完成连接。TcpListener对象接收和发送数据是利用Socket对象,分别调用Receive()和Send();TcpClient对象接收和发送数据是利用NetworkStream对象,分别调用Read()和Write()。注意!接收.原创 2021-11-21 16:57:47 · 2924 阅读 · 1 评论 -
C#应用 - 06.修改raw图像的常用操作
修改raw图像的常用操作,包括降低分辨率、平滑数据、分割数据、添加边缘点等,主要用于制作地形。using System;using System.IO;namespace _06{ class Program { static void Main(string[] args) { } } class Test { /// <summary> /// 获取原数据.原创 2021-11-21 13:38:00 · 491 阅读 · 0 评论 -
C#应用 - 05.怎么分割bmp图像和raw图像
bmp图像含有头数据,一般长度为54个字节,像素按照从左到右,从下到上的顺序排列;raw图像不含头数据,且像素为1个字节,因此直接分割即可,像素按照从左到右,从上到下的顺序排列。bmp图像按照从左到右,从下到上的顺序依次输出编号为[1,rowCount*colCount]的bmp图像;raw图像按照从左到右,从上到下的顺序依次输出编号为[1,rowCount*colCount]的raw图像。注意,rowCount和colCount必须为原图高度和宽度的整数因子。using System;usin.原创 2021-11-21 13:21:07 · 949 阅读 · 0 评论 -
C#应用 - 04.怎么按下标获取Dictionary的元素
按下标获取Dictionary的元素主要利用了查询表达式LINQ的扩展方法。using System;using System.Collections.Generic;using System.Linq;namespace _04{ class Program { static void Main(string[] args) { Dictionary<object, object> dictionary =.原创 2021-11-20 22:02:24 · 1702 阅读 · 0 评论 -
C#应用 - 03.怎么对Dictionary进行排序
对Dictionary进行排序主要利用了查询表达式LINQ。using System;using System.Collections.Generic;using System.Linq;namespace _03{ class Program { static void Main(string[] args) { Console.WriteLine("*****按添加顺序排列*****"); D.原创 2021-11-20 21:45:14 · 2406 阅读 · 0 评论 -
C#应用 - 02.怎么利用多线程快速完成多重循环
由于多线程只能执行无参或单参的方法,而多重循环需要一次性传入两个或两个以上的参数,因此,可以创建一个类型用于存储多重循环的参数,执行方法时传入该类型的对象,即可实现一次性传入多个参数。线程并不是越多越好,要根据计算机的CPU和内存控制线程的数量。可以设置全局变量控制线程的数量,在开辟线程前利用死循环实现主线程的阻塞,当线程数量小于给定值时才开辟新的线程,在线程方法执行完毕后设置线程数量减1即可。可以设置全局变量判断多重循环是否执行完毕,在线程方法执行完毕后设置完成数量加1即可。注意!多线程调用的方.原创 2021-11-20 21:03:50 · 1859 阅读 · 0 评论 -
C#应用 - 01.怎么求两个List集合的交并差集
求交并差集主要利用了查询表达式LINQ的扩展方法。using System;using System.Collections.Generic;using System.Linq;namespace _01{ class Program { static void Main(string[] args) { List<object> list1 = new List<object>() { 1, '.原创 2021-11-20 20:22:31 · 1171 阅读 · 0 评论 -
√ C# - 25.怎么操作文件
操作文件的常用类:File、FileStream、FileInfo等。操作目录的常用类:Directory、Path等。一般情况下,使用File类的静态方法即可满足日常需求,包括按行读取写入、按字节读取写入等。绝对路径的格式:如【D:\Desktop\Files\file.txt】。相对路径的格式:如【…\…\…\…\…\fileStream.txt】,注意,【…\】里面是两个点,CSDN表示不出来!相对路径中的【…\】表示起始目录的上一级目录,比如起始目录是【…\CSharpLearn\25\.原创 2021-03-31 15:17:59 · 16989 阅读 · 0 评论 -
√ C# - 24.怎么使用多线程(P566、P631)
创建线程的类有三种:Thread类、ThreadPool类、Task类。使用Thread类需要实例化Thread对象,调用无参方法需要传入ThreadStart委托对象,调用有参方法需要传入ParameterizedThreadStart委托对象,实例化Thread对象后调用Start()即可。使用ThreadPool类直接调用ThreadPool.QueueUserWorkItem()即可,传入有参方法及其参数。使用Task类直接调用Task.Run()即可,传入无参方法或有参方法及其参数。有参.原创 2021-03-31 15:16:17 · 17007 阅读 · 0 评论 -
√ C# - 23.怎么自定义集合(P496)
集合的本质是一个类,它至少实现了IEnumerable接口,因此,IEnumerable接口使类成为集合。为了使集合更加规范,通常也会实现ICollection接口和索引器。实现方法时注意异常判断,以下只是基本功能实现。using System;using System.Collections;using System.Collections.Generic;namespace _23{ class Program { static void Main(s.原创 2021-03-31 15:14:09 · 16941 阅读 · 0 评论 -
√ C# - 22.怎么使用集合(P436)
集合分为泛型集合和非泛型集合,泛型集合的元素类型为指定类型,非泛型集合的元素类型为object,一般使用泛型集合。List类的底层是数组,适合读多写少,访问顺序与添加顺序相同。LinkedList类的底层是链表,适合写多读少,可以在链表尾部添加元素,也可以在链表头部添加元素,访问顺序是从链表头部到链表尾部。Stack类是先进后出的数据结构,只能在栈顶进行入栈出栈操作。Queue类是先进先出的数据结构,只能在队尾进行入队操作,队首进行出队操作。HashSet类的底层是哈希表,具有元素不重复性。S.原创 2021-03-31 15:12:08 · 16941 阅读 · 1 评论 -
√ C# - 21.怎么使用泛型(P350)
泛型类可以实现泛型接口和非泛型接口,非泛型类只能实现非泛型接口。同名的泛型类和非泛型类不是同一类型,不同类型参数的泛型类也不是同一类型。泛型属性的默认值为default(T)。约束描述了类型参数的特征,类约束规定了类型参数能够转换为该类,接口约束规定了类型参数必须实现了该接口。类约束只能有一个,且必须位于约束列表的第一个,接口约束可以有多个。using System;namespace _21{ class Program { static void Ma.原创 2021-03-31 14:13:31 · 16945 阅读 · 0 评论 -
√ C# - 20.怎么使用特性(P539)
利用特性指定与被修饰的构造有关的额外元数据。特性可以修饰类、接口、结构、枚举、委托、事件、方法、构造函数、字段、属性、参数、返回值、程序集、类型参数和模块。程序集的特性用于添加有关程序集的额外元数据。特性在Web开发中使用较多,例如SpringBoot,日常使用较多的特性是Obsolete,表示被修饰的构造是弃用的。一般类继承Attribute类即可成为自定义特性。using System;namespace _20{ class Program { st.原创 2021-03-31 13:08:11 · 16986 阅读 · 0 评论 -
√ C# - 19.怎么使用反射(P528)
反射是在程序运行时动态地获取程序或程序集中的元数据,例如类、字段、属性、方法等。通过枚举类型BindingFlags控制获取信息的范围。using System;using System.Reflection;namespace _19{ class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); .原创 2021-03-31 10:12:34 · 17022 阅读 · 0 评论 -
√ C# - 18.怎么使用接口(P252)
接口相当于一种功能提供方与功能使用方之间的约定,它规定了功能提供方应该提供什么功能,功能使用方可以使用什么功能。相较于抽象类,接口更加抽象,不能包含任何实现,所有成员自动是public的,不必也不允许使用访问修饰符。接口中不能声明字段,但可以声明属性,即可以要求派生类包含特定的数据。接口不能包含静态成员。接口命名必须加"I"前缀。一个接口可以继承另一个接口,也可以继承多个接口,继承的接口将继承基接口的所有成员。一般来说,接口的产生方法有两种,一种是代码重构时自底向上产生接口,另一种是设计程序时.原创 2021-03-30 21:01:40 · 16986 阅读 · 0 评论 -
√ C# - 17.怎么使用抽象类(P242)
抽象类是仅供派生的类,主要特点是包含抽象成员,不能被实例化,只能实例化其派生的具体类。抽象成员是没有实现的方法或属性,作用是强制派生类提供实现,因此不能声明为private。派生类如果没有实现抽象类的所有抽象成员,则该派生类只能继续声明为抽象类。using System;namespace _17{ class Program { static void Main(string[] args) { Test1 test1.原创 2021-03-30 10:40:01 · 16978 阅读 · 0 评论 -
√ C# - 16.怎么重写基类(P232)
C#支持重写实例方法和属性,不支持重写字段和静态成员。基类必须使用关键字virtual标记允许重写的成员,派生类必须使用关键字override标记被重写的成员。被重写的成员仍然是虚成员,仍然可以被派生类继续重写。若要中止某一成员继承链,则使用关键字new修饰该成员,这样该成员自此由虚转实,不可以再被派生类重写。using System;namespace _16{ class Program { static void Main(string[] args).原创 2021-03-30 09:49:10 · 17533 阅读 · 0 评论 -
√ C# - 15.怎么使用LINQ(P478)
查询表达式(LINQ)用于从集合中筛选出符合条件的元素,与SQL语句极为相似。一般情况下,返回的结果是IEnumerable<T>类型的集合,T的类型由select子句或group by子句决定。查询表达式总是以【from子句】开始,以【select子句】或【group by子句】结束。关键字from后面是标识符,表示集合中的每一项,类似foreach循环中的item。关键字in后面是被查询的集合。关键字select后面是返回集合的元素类型,即T。关键字where后面是筛选条件。.原创 2021-03-27 20:22:56 · 16966 阅读 · 0 评论 -
√ C# - 14.怎么声明自定义事件(P414)
编译器为【+=】和【-=】生成的代码是可以自定义的。C#允许添加自定义的add和remove块,为事件封装的各个组成部分提供自定义实现。using System;namespace _14{ class Program { static void Main(string[] args) { Publisher publisher = new Publisher(); Subscriber1 sub.原创 2021-03-27 20:22:22 · 16970 阅读 · 0 评论 -
√ C# - 13.怎么使用事件(P414)
事件基于委托,其本质是委托的包装器,用于限制外界对委托的访问,隐藏了委托的大部分功能,仅暴露委托的注册、移除方法引用的功能。事件使用Publish-Subscribe(发布-订阅)模型。发布器是一个包含事件和委托定义的对象。订阅器是一个接收事件并处理事件的对象。事件在类中声明,通过委托与事件处理器相关联。using System;namespace _13{ class Program { static void Main(string[] args) .原创 2021-03-27 20:16:27 · 16940 阅读 · 0 评论 -
√ C# - 12.怎么使用Lambda表达式(P396)
Lambda表达式是匿名方法的精简版,目的是当需要基于很简单的方法生成委托时,避免声明全新成员的麻烦。Lambda表达式分为两种:语句Lambda和表达式Lambda。语句Lambda由形参列表、Lambda操作符=>、代码块构成。表达式Lambda由要返回的表达式构成。Lambda表达式最常用于属性的get和set方法,以及排序的比较方法。using System;using System.Collections.Generic;namespace _12{ class.原创 2021-03-27 20:08:57 · 16967 阅读 · 0 评论 -
√ C# - 11.怎么使用委托(P387、P390)
委托是一种特殊的类,它允许捕捉对方法的引用,并像传递其他对象那样传递该引用,像调用其他方法那样调用该方法。默认委托包括无返回值的泛型委托Action<>、有返回值的泛型委托Func<>。调用方法的方式有两种,一种是利用方法名直接调用,另一种是利用委托间接调用。同步调用是在同一线程内依次调用,异步调用是在不同线程内同时调用。直接同步调用:利用方法名。间接同步调用:调用委托的Invoke()。显式异步调用:利用Thread类或者Task类。隐式异步调用:调用委托的Begi.原创 2021-03-27 20:07:53 · 17014 阅读 · 0 评论 -
√ C# - 10.怎么声明扩展方法(P213)
扩展方法是对一个类追加实例方法。扩展方法是static的,必须放在一个public static类中,参数列表的第一个参数必须是被追加静态方法的类型,由关键字this修饰。虽然扩展方法是静态的,但只能当做实例方法调用。一般SomeType类的扩展方法由SomeTypeExtension类统一收纳。using System;namespace _10{ class Program { static void Main(string[] args) .原创 2021-03-26 15:12:01 · 16949 阅读 · 0 评论 -
√ C# - 09.怎么设置索引器(P512)
利用索引器可以直接对类的对象进行索引实例数组的操作。索引器的结构类似于属性,将属性名替换成关键字this,后面加上中括号[],可以接收任意类型的参数。索引器的返回值类型不能是void。索引器可以重载。先敲出indexer,然后敲一下Tab键,就可以快速生成一个索引器。using System;namespace _09{ class Program { static void Main(string[] args) { .原创 2021-03-26 10:56:15 · 16987 阅读 · 1 评论 -
√ C# - 08.怎么声明属性(P184)
属性(Property)的实现由两个可选的部分构成,get部分标志属性的取值方法,set部分标志属性的赋值方法。set部分中的上下文关键字value引用赋值操作的右侧部分。利用属性可以限制外部对类中的private字段的取值和赋值操作,并且可以在赋值时提供属性验证功能。删除get部分可使属性变成只写属性,删除set部分或在set前添加访问修饰符private,可使属性变成只读属性或仅在类的内部可写,保护字段不被外部赋值。先敲出prop,然后敲一下Tab键,就可以快速生成一个简略属性。先敲出pro.原创 2021-03-26 10:23:27 · 17302 阅读 · 0 评论 -
√ C# - 07.怎么捕捉异常(P334)
所有异常类型都派生于Exception类。利用关键字try检测可能出现异常的语句块,利用关键字throw抛出异常对象,利用关键字catch执行捕捉到相应异常时的语句块。若存在多个catch块,则程序会依次寻找与检测到的异常最匹配的catch块,因此捕捉Exception异常的catch块通常是最后一个catch块。利用关键字finally执行无论前面是否捕捉到异常都会执行的语句块。using System;namespace _07{ class Program { .原创 2021-03-25 19:01:59 · 17045 阅读 · 0 评论 -
√ C# - 06.怎么自定义类型转换(P310)
类型转换分为显式类型转换和隐式类型转换,分别对应关键字explicit和implicit,后面加上关键字operator。实现类型转换的方法必须是public static的,且放在被转换的类中。using System;namespace _06{ class Program { static void Main(string[] args) { Test1 test1 = new Test1(1); .原创 2021-03-24 10:15:08 · 17090 阅读 · 0 评论 -
√ C# - 05.怎么重载操作符(P305)
操作符的本质是对方法的简化。实现操作符重载的方法必须是public static的,后面加上关键字operator和被重载的操作符,如【+】,且放在操作数的类中。方法的返回值类型不能是void,但可以是其他类型。using System;namespace _05{ class Program { static void Main(string[] args) { Test1 test11 = new Test1(1);.原创 2021-03-20 09:54:27 · 17035 阅读 · 0 评论 -
√ C# - 04.常用的数据类型(P29、P53)
C#中所有的数据类型都派生于Object类,根据拷贝策略可分为两类:引用类型(ReferenceType)、值类型(ValueType)。引用类型包括类(class)、接口(interface)、委托(delegate)。值类型包括结构体(struct)、枚举(enum)。C#预定义了一组简单类型,通过关键字标识。其中,引用类型包括Object类型(object)、字符串类型(string),值类型包括整数类型(sbyte、byte、short、ushort、int、uint、long、ulong).原创 2021-03-19 11:32:38 · 17045 阅读 · 0 评论 -
√ C# - 03.怎么利用递归解决汉诺塔问题
1. 题目如下图所示,有三根相邻的柱子,分别标记为A、B、C。柱子A从上到下按金字塔状叠放着n个大小依次递增的盘子,若此时需要把所有的盘子移动到柱子C上,条件是每次只能移动一个盘子,而且所有柱子上都不能出现大盘子落在小盘子上方的情况,请问至少需要移动多少次?2. 解法(1)考虑只有一个盘子的情况,此时只需要把柱子A上的盘子移动到柱子C即可,记为“A -> C”。(2)考虑有两个盘子的情况,此时需要先把柱子A上的小盘子移动到柱子B,记为“A -> B”,再把柱子A上的大盘子移动到柱子C,原创 2021-03-16 18:59:28 · 17105 阅读 · 0 评论 -
√ C# - 02.怎么生成和引用DLL文件(P311)
DLL(Dynamic Link Library,动态链接库)是一种封装类的技术。首先新建一个类库项目,然后实现目标类及其方法。using System;namespace ClassLibrary1{ public class DLLTest { public static void Print() { Console.WriteLine("DLLTest"); } }}实现完毕后,点击.原创 2021-03-15 19:04:51 · 16986 阅读 · 0 评论 -
√ C# - 01.怎么向主函数传参
以下面的项目为例。using System;namespace _01{ class Program { static void Main(string[] args) { int sum = 0; foreach (var item in args) { sum += int.Parse(item); } .原创 2021-03-15 19:02:29 · 17500 阅读 · 0 评论