c#
分享众多C#知识。包括C#基础知识,多线程,Collection,LINQ等等
皮皮君
从事物联网行业十多年,室内定位专家,现作为技术专家进入汽车领域
展开
-
C# 一行实现byte[]数组转十六进制字符串
byte[] byteArray = new byte[]{0x9E,0xAB,0xE4,0xBD};string str = BitConverter.ToString(msgData, 0).Replace("-", string.Empty);原创 2020-12-10 15:02:28 · 887 阅读 · 1 评论 -
一行搞定List<T>中的成员数量统计
一行搞定List中的成员出现次数的数量统计经常遇到这么一类问题,我们要统计List<T>列表中不同值成员出现的次数。在C#本可以巧用Linq中的**GroupBy(…)**方法。下面我们给一个例子,只需一行代码即可搞定成员出现次数的数量统计: class MySample { public static void Main() { List<int> idList = new List<int>(原创 2020-10-23 17:17:34 · 3351 阅读 · 0 评论 -
C# 检测Ctrl+c和其他程序退出
代码using System;using System.Threading;public class Example{ public static void Main() { AppDomain appd = AppDomain.CurrentDomain; appd.ProcessExit += (s, e) => { System.Console.WriteLine("Exit here.");原创 2020-07-28 17:47:06 · 2317 阅读 · 0 评论 -
C# Task的任务取消
Task任务取消取消任务使用CancellationToken这个令牌,这是个struct结构体。看一段代码:using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;public class Example{ public static void Main() { // Define the cancellation t原创 2020-07-26 19:54:55 · 3764 阅读 · 0 评论 -
C# 关于依赖注入中的Scpoe概念
依赖注入AddScoped()方法Singleton和transient两种依赖注入方式比较容易懂。今天专门讲一下依赖注入Scope域的概念。直接上例子:using System;using Microsoft.Extensions.DependencyInjection;namespace vscode_test5{ interface IMyInfo { void PrintID(); } public class MyInf原创 2020-05-28 21:32:55 · 1450 阅读 · 0 评论 -
C# 依赖注入简单例子
依赖注入简单例子using System;using Microsoft.Extensions.DependencyInjection;class Program{ interface ITanGuan { void hello(); } class TanGuan:ITanGuan { public int A{get;set;} public int B{get;set;} public原创 2020-05-27 14:13:16 · 1602 阅读 · 0 评论 -
C# 依赖注入IServiceCollection的AddSingleton方法使用
AddSingleton(IServiceCollection, Type, Func<IServiceProvider,Object>)方法这个方法是通过提供一个Func<IServiceProvider,Object>的delegate委托来实现服务的获取。具体怎么用,下面给一个简单例子:using System;using Microsoft.Extensions.DependencyInjection;class Program{ interface I原创 2020-05-22 18:05:06 · 15243 阅读 · 0 评论 -
C# 十六进制输出的代码
// Display the byte array in a readable format. public static void PrintByteArray(byte[] array) { for (int i = 0; i < array.Length; i++) { Console.Write($"{array[i]:X2}"); if ((i % 4) == 3) Console.Wri...原创 2020-05-21 12:55:14 · 3747 阅读 · 0 评论 -
C# 关于Licensing许可
现在我们给出一个最简单的许可代码(无许可文件)using System;using System.ComponentModel;using System.Diagnostics;namespace Hello{ public class Program { static void Main() { // use the licensed component MyClass. using(MyClas.原创 2020-05-20 15:29:35 · 4517 阅读 · 1 评论 -
C# 线程(四)——ThreadPool线程池
线程池概念 每当您启动一个线程时,都会花费几百微秒来组织新的私有局部变量堆栈。每个线程还消耗(默认情况下)大约1 MB的内存。线程池通过共享和回收线程来减少这些开销,从而允许在非常精细的级别上应用多线程,而不会降低性能。这在利用多核处理器以“分而治之”的方式并行执行计算密集型代码时非常有用。 线程池还限制了它将同时运行的工作线程总数。太多的活动线程用管理负担来限制操作系统,并使CPU缓存无效。一旦达到限制,作业将原创 2020-05-11 12:41:15 · 660 阅读 · 0 评论 -
C# 线程(三)——前台和后台线程
默认情况下,我们显式创建的线程是前台线程。 只要前台线程中的任何一个正在运行,它就可以使应用程序保持活动状态,而后台线程则不会。 一旦所有前台线程完成,应用程序结束,所有仍在运行的后台线程终止。您可以使用其IsBackground属性查询或更改线程的背景状态。 下面给一个例子:class PriorityTest{ static void Main (string[] args) { Thread worker = new Thread ( () => Console.ReadL原创 2020-05-10 21:39:39 · 880 阅读 · 0 评论 -
C# 线程(二)——匿名函数给线程Thread传递参数
这里主要讨论用Lambda表达式给Thread传递参数。我们除了用ParameterizedThreadStart委托传递参数,还可以用lambda表达式为Thread传递参数,如下例子所示:static void Main(){ Thread t = new Thread ( () => Print ("Hello from t!") ); t.Start();} static void Print (string message) { Console.WriteLine原创 2020-05-10 19:54:10 · 2397 阅读 · 0 评论 -
C# 线程(一)——概述
进程和线程 进程是一个执行程序。操作系统使用进程来分离正在执行的应用程序。线程是操作系统分配处理器时间的基本单元。每个线程都有一个调度优先级,并维护一组结构,当线程执行暂停时,系统使用这些结构保存线程上下文。线程上下文包括线程无缝恢复执行所需的所有信息,包括线程的一组CPU寄存器和堆栈。多个线程可以在进程的上下文中运行。进程的所有线程共享其虚拟地址空间。线程可以执行程序代码的任何部分,包括当前由另一个线程执行的部分。举个例子的话,QQ是一个进程,World是一个进程,浏览器也是一个进程,这三个进程原创 2020-05-10 11:45:09 · 199 阅读 · 0 评论 -
C# 线程(五)——线程原语WaitHandle抽象类
WaitHandle是抽象类。它用来封装操作系统的特定对象(也就是操作系统所提供的某个资源对象),程序中通过等待这个特定操作系统对象来独占式访问某个共享资源(一般是某个用户定义的对象资源)。它一般是用于多线程的环境下。public abstract class WaitHandle : MarshalByRefObject, IDisposable派生自WaitHandle的类包括:MutexEventWaitHandle , AutoResetEvent , ManualResetEvent原创 2020-05-09 22:35:54 · 264 阅读 · 0 评论 -
C#设计模式(23种设计模式)
C#设计模式(23种设计模式)转载 2020-04-11 18:03:34 · 1102 阅读 · 0 评论 -
C# 深刻理解资源释放
深刻理解C#中资源释放转载 2020-04-09 08:29:42 · 198 阅读 · 0 评论 -
C#关于List的线程安全问题(二)
上一期,C#关于List的线程安全问题(一)我们给出了一个线程不安全的例子。这个例子给人的感觉就是总觉得哪里不对,命名插入5000个数据到List中,结果却并不是自己想要的。明明一共插入了1300个数据,结果也不是。这都是因为List默认线程不安全导致的,也就是当某一个线程正在往List中插入数据,结果由于其他线程也正在做插入动作,导致冲突,插入可能失败,并且插入的顺序是不可控的,除非...原创 2020-04-06 16:11:45 · 3868 阅读 · 0 评论 -
C# 不需要查手册接口代码自动化实现
C#有非常多的接口,如果每次想实现一个接口,都去翻看微软手册,那么耗时耗力,降低效率。实际上VS Code有一个非常人性化的方法,可以通过提示瞬间实现接口模板,仅仅需要鼠标点两下就可以。举个例子,你要实现IEnumerable这个接口,你输入了下面的代码:我们会发现在IEnumerable下方出现红色波浪线,提示这个地方有错。当然有错了,我们还未实现接口。这个时候,我们将鼠标移...原创 2020-04-05 21:49:35 · 345 阅读 · 0 评论 -
C# IEnumerable接口
C# 中如果需要使用关键字foreach去迭代(轮询)一遍一个集合的内容,那么就需要这个类实现IEnumerable接口。C# 很多官方提供的Collection集合已经实现了IEnumerable接口的,比如ArrayList,Queue,Stack等类都实现了IEnumerable接口,我们可以放心使用foreach。(ArrayList是通过IList接口间接包含了IEnumerable...原创 2020-04-05 21:21:52 · 4709 阅读 · 0 评论 -
C# 隐式实现接口和显示实现接口
请参考下面这篇文章:https://www.cnblogs.com/lori/archive/2013/05/08/3066233.html转载 2020-04-05 10:15:37 · 445 阅读 · 0 评论 -
C#关于List的线程安全问题(一)
C# 关于List的线程安全问题首先,List这个集合类是不安全的。直接给例子,讲一下吧:using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;namespace vscode_test2{ class Program {...原创 2020-03-24 16:43:01 · 4267 阅读 · 0 评论 -
ASP.NET Core 的pipeline中间件
ASP.NET Core 的pipeline中间件...namespace Microsoft.AspNetCore.Builder{ ... /// <summary> /// Adds a middleware delegate to the application's request pipeline. ///...原创 2020-02-13 20:20:25 · 808 阅读 · 0 评论 -
C# 有了委托(delegate)为什么还需要事件(event)?
delegate void dowork(); // 委托申明class Baby{ public event dowork CryEvent; // 事件成员() public void Play() { System.Console.WriteLine("孩子在玩耍..."); Thread.Sleep(2000); ...原创 2020-02-14 22:53:14 · 2152 阅读 · 3 评论 -
C# 直接调用async Task方法而不出现waring
一般来说,直接调用一个async Task的异步方法会出现波浪线(提示在方法前面加await的warning)。class Program{ private static async Task doSomethingAsync() { await Task.Run(()=>{ // 做一些耗时的事情. });...原创 2020-02-14 21:34:21 · 1772 阅读 · 1 评论 -
c# WaitHandle的WaitOne(int, bool)方法
c# WaitHandle的WaitOne(int, bool)方法WaitHandle类用于线程的同步。WaitOne方法用于阻止当前线程,直到当前WaitHandle接收到信号。WaitOne(int, bool)方法是其中的一个重载。第一个参数很好理解,表示当前线程等待信号的超时时间,单位是ms。第二个参数表示等待之前是否退出上下文的同步域,true表示退出,false表示不退出。...原创 2020-01-19 14:41:27 · 10882 阅读 · 1 评论 -
c# Task.Wait()与awaiat Task异常处理区别
Task异常处理先看下面用await的例子与输出:using System;using System.Threading;using System.Threading.Tasks;class Program{ static async Task Main() { System.Console.WriteLine($"Main Task ID:{Thre...原创 2020-01-13 11:01:45 · 4446 阅读 · 2 评论 -
c# Task任务的取消
Task任务的取消c# 任务的取消,需要用到CancellationTokenSource类,CancellationToken类。下面的列子通过Task.Run产生了一个任务。任务的内部不停地调用CancellationToken的ThrowIfCancellationRequested()方法,这个函数会抛出一个叫做OperationCanceledException的异常,它的实现(微...原创 2020-01-11 15:18:30 · 11434 阅读 · 3 评论 -
c# Thread.Abort()和Thread.ResetAbort()的使用
c# Thread.ResetAbort()的使用Thread类的Abort()方法用于终止正在运行的线程。它可以强行终止线程,而不管线程是否是sleep中。执行了Abort()后,被终止的线程就会运行到try{}catch{}语句当中,因为是强行终止,catch后的语句则不再运行。除非在catch语句中执行Thread.ResetAbort()这个静态方法。先举例没有ResetAbort(...原创 2020-01-09 16:01:35 · 3755 阅读 · 0 评论 -
c#一段微软读取文件夹下所有文件大小的代码
c#一段微软读取文件夹下所有文件大小的代码下面这段代码用Task类,非常高效率简洁方式获取某文件夹内文件大小的代码:using System;using System.Collections.Generic;using System.IO;using System.Threading;using System.Threading.Tasks;public class Example...原创 2020-01-09 10:20:02 · 411 阅读 · 0 评论 -
C# 不用async异步方法
不用async异步方法C#并不是一定要用async方法才能实现异步。Thread实现异步第一种方式,可以用Thread类实现线程来执行异步任务,举例:using System;using System.Threading;namespace test{ class Program { static void Main(string[] args) ...原创 2020-01-07 19:51:05 · 889 阅读 · 0 评论 -
async关键字(异步方法)
async关键字(异步方法)async关键字是C#特有的。Java没有这玩意。async关键字用来修饰两类方法: lambda表达式或者异步方法。拥有async修饰的方法称为async方法,比如:public async Task<int> ExampleMethodAsync() { // . . . . }async修饰的方法内部,必须出现一个awa...原创 2020-01-08 15:50:39 · 2167 阅读 · 0 评论 -
什么时候选择.NET Core或.NET Framework
使用.NET Core,当:需要跨平台 你的目标是微服务 你使用Docker容器 您需要高性能和可扩展的系统 每个应用程序都需要并行的.NET版本 使用.NET Framework,当:您的应用程序当前使用.NET框架(建议扩展而不是迁移) 你的应用程序使用第三方.NET库或.NET Core不可用的NuGet包 你的应用使用了.NET Core无法使用的.NE...原创 2019-12-23 09:10:51 · 407 阅读 · 0 评论 -
.net core版本
.Net Core版本分两个方面:.NET Core Runtime .NET Core SDK一般如果说".Net Core 2.1"大多数时候指的是.NET Core Runtime 2.1。.NET Core Runtime就是运行时环境。我们的代码经过.NET Core SDK开发并编译后,最后是运行在Runtime上面的,所以SDK和Runtime是两个东西,Runtime就类似...原创 2019-12-11 10:21:06 · 2285 阅读 · 1 评论 -
C# 中英文混合字符串对齐
private static string padRightEx(string str, int totalByteCount) { Encoding coding = Encoding.GetEncoding("UTF-8"); int dcount = 0; foreach (char c...原创 2019-11-06 14:05:44 · 1231 阅读 · 0 评论 -
.net core c# 串口编程
在.net core环境下(.net code)使用System.IO.Ports.SerialPort会报错,这是由于System.IO.Ports版本不对。可以使用NuGet获取新版本:dotnet add package System.IO.Ports --version 4.6.0这样子,SerialPort就可以使用了。...原创 2019-10-14 21:52:57 · 3371 阅读 · 0 评论 -
vs code上创建.net core c#项目过程
dotnet new sln 创建解决方案工程dotnet new classlib 创建库dotnet new console 创建控制台应用dotnet sln add ./XXXX/XXXXX.csproj 将某个工程添加到解决方案中dotnet new xunit 创...原创 2019-08-09 08:56:34 · 934 阅读 · 0 评论 -
c# EasyHttp的使用(一)
github资源下载地址:https://github.com/EasyHttp/EasyHttp.git实现了简单的http客户端库。VS可以通过NuGet方式下载库文件。post Json数据举例子: public class Customer { public string Name; public string Email;...原创 2018-11-07 18:10:06 · 5254 阅读 · 0 评论 -
2014祝程序员节程序员们快乐!一段小代码:统计计算丢包数
private static int cnt = 0; // 统计收到的包数 private static int lastsn = 0; // 保存上一个包的序号值 private static int lostcnt = 0; // 统计丢包的个数 private static void printLostInfo(int s...原创 2018-10-24 17:23:30 · 223 阅读 · 0 评论 -
c# 十六进制数据转十六进制字符串
public class Utility { /// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes">字节数组</param> /// <returns>返回...原创 2018-10-24 15:24:18 · 2496 阅读 · 0 评论 -
c# IP地址转long型
ip地址是string型,有时候需要转换成long型,便于ip地址比较,甚至遍历。如下例子一个是起始ip地址,一个是结束ip地址. byte[] byts = IPAddress.Parse(beginIP).GetAddressBytes(); Array.Reverse(byts); // 需要倒置一次字节序 long be...原创 2018-06-22 15:19:51 · 2313 阅读 · 0 评论