
.NET Framework+CLR+C#知识
文章平均质量分 65
.NET跨平台
比较认真。编程就是算法和数据结构,算法和数据结构是编程的灵魂。
展开
-
C#实现盲计算
允许多个参与方在不泄露自身数据的情况下,共同计算某个函数的结果。例如,两个公司可以计算它们共享的客户数量,而不会暴露完整的客户列表。允许用户在不暴露明文的情况下,获取签名。例如,一个银行可以给用户签名电子货币,而不知晓具体金额。FHE.NET是一个 .NET 6 下的同态加密库,可以用于 MPC 计算。是微软开源的同态加密库,支持在加密数据上直接进行数学运算。和 C# 可以实现盲计算,主要依赖于。下可行的盲计算方案和示例代码。中实际应用盲计算,可以结合。可以通过 NuGet 安装。以下代码展示了如何使用。原创 2025-03-20 22:04:54 · 901 阅读 · 0 评论 -
深入理解.NET MemoryCache
是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理,借助该类型可以实现ASP.NET中常用的Cache类的相似功能,并且可以适应更加丰富的使用场景。在使用时常常有各种疑问,数据是怎么组织的?有没有可能用更高效的组织和使用方式?数据超时如何控制?为了知其所以然,本文中对于的原理和实现方式进行了深入分析,同时在分析的过程中学习到了许多业界成熟组件的设计思想,为今后的工作打开了更加开阔的思路。转载 2022-12-15 23:38:41 · 722 阅读 · 0 评论 -
整理一下 System.Linq.Enumerable 类中的那些比较少用的方法
Linq 虽然用得多,但是里面有一些方法比较少用,因此整理一下。Enumerable 类的所有方法可以在 MSDN 上查阅到:https://msdn.microsoft.com/zh-cn/library/system.linq.enumerable.aspxAggregate这个方法有三个重载,先看第一个Aggregate<TSource>(IEnumerable<TSource>, Func<TSource, TSource, TSource>)参数是接受转载 2022-03-09 23:04:41 · 432 阅读 · 0 评论 -
C#与SQl数据的对应关系(tinyint、smallint、int、bigint)
在C#中对应的说明SQL C#bigint(sql大小:8byte) long(64位)int, integer(sql大小:4byte) int(32位)smallint(sql大小:2byte) short(16位)tinyin转载 2022-02-24 22:24:12 · 3902 阅读 · 0 评论 -
使用System.ComponentModel.DataAnnotations验证字段数据正确性
在.NET MVC 中,当页面提交model到Action的时候,自动填充ModelState。使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.ComponentModel.DataAnnotations中的各种方法进行验证。但是使用非MVC架构时,就需要写很多if判断或者正则表达式,当有多个字段需要验证的的时候不知道有多少人和我一样很厌烦这种用if判断的方式。这里记录一个方法,使用System.ComponentModel.DataAnnotations转载 2022-02-19 17:37:00 · 3742 阅读 · 2 评论 -
C# List引用类型克隆的3种方法
前言有时候我们想克隆一个List去做别的事,而不影响原来的List,我们直接在list后面加上小点点,发现并没有Clone这样的扩展函数。这时候就只有自己扩展了。尝试了三种方式,测试都通过了,至于性能方面我还没有做测试。下面话不多说了,来一起看看详细的介绍吧一、反射public static List<T> Clone<T>(this List<T> list) where T : new() { List<T> items = new L转载 2022-02-09 00:33:11 · 2028 阅读 · 0 评论 -
详解C# List<T>的Contains,Exists,Any,Where性能对比
测试新建一个Person类public class Person { public Person(string name,int id) { Name = name; Id = id; } public string Name { get; set; } public int Id { get; set; } }初始化List 中有一百万条数据,然后分别通过每种方法判断xiaoming是否在List中,代码如下static转载 2022-02-03 21:44:58 · 3031 阅读 · 1 评论 -
中文在UTF8和GBK编码中的范围
编码范围1. GBK (GB2312/GB18030)x00-xff GBK双字节编码范围x20-x7f ASCIIxa1-xff 中文x80-xff 中文2. UTF-8 (Unicode)u4e00-u9fa5 (中文)x3130-x318F (韩文)xAC00-xD7A3 (韩文)u0800-u4e00 (日文)ps: 韩文是大于[u9fa5]的字符正则例子(使用PHP):preg_replace(“/([x80-xff])/”,”",$str); //GBK中匹配p转载 2021-10-07 21:56:07 · 9626 阅读 · 1 评论 -
json序列化数据超出最大值(maxJsonLength)
1、序列化:以下代码在对象过大时会报错:进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值。//jsonObj比较大的时候会报错var serializer = new JavaScriptSerializer();return serializer.Serialize(jsonObj);使用Newtonsoft.Json也有此问题,解决方案是设置MaxJsonLength:var serializer = new JavaScriptSerialize转载 2021-10-07 00:34:34 · 8232 阅读 · 0 评论 -
.NET的ConcurrentDictionary,线程安全集合类
ConcurrentDictionary 是.NET 4.0里面新增的号称线程安全的集合类。那么自然,我们会预期ConcurrentDictionary 中的代码是线程安全的(至少几个关键方法是线程安全的).举个例子,使用者可能会预期GetOrAdd中的方法当Key不存在的时候只执行一次Add的委托,第二次调用GetOrAdd就应该直接取回刚才生成的值了.参考一下以下代码:public static void Test(){ var concurentDictionary = new C转载 2021-10-06 11:49:54 · 4870 阅读 · 0 评论 -
String是值类型,还是引用类型
一直记得,JAVA语言除了8大基本类型(byte,short,char,int,long,float,double,boolean),其他类型皆为引用类型。但是,今天有人告诉我String为值类型,顿时迷惑了。回来百度一通,有人说String是值类型,也有人说String是引用类型,大家都有自己的说法。好吧,求人不如求己,实践出真知。首先申明下结论:Java中的String是正宗的引用类型,但是,一定条件下,String会表现出一定的值特性。贴上代码,开工:public class MainActiv转载 2021-09-08 23:59:11 · 1604 阅读 · 0 评论 -
C#使用IsAssignableFrom与“开放”的泛型类型
public static bool IsAssignableToGenericType(Type givenType, Type genericType){ var interfaceTypes = givenType.GetInterfaces(); foreach (var it in interfaceTypes) { if (it.IsGenericType && it.GetGenericTypeDefinition() == gene转载 2021-09-05 18:59:28 · 2022 阅读 · 0 评论 -
int.TryParse非预期执行引发的思考
问题出现这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了。代码如下:int id = 1000;//Request.QueryString["id"] = nullint.TryParse( Request.QueryString["id"], out id );//使用 id 进行其他操作...因为Request.QueryString["id"] = null,所以我的预期是id=1000。可是我错了,实际结果是id=0。测试多次都是这样。我感觉要出事了。事实上我转载 2021-09-04 16:34:34 · 316 阅读 · 0 评论 -
IQueryable 和 IEnumerable 的区别
在C#中使用 Linq to sql 时,经常搞混 IQueryable 和 IEnumerable 这两种类型,本文简单分析下它们之间的区别和使用场景。前言不管是Linq to object,还是Linq to sql或Linq to Entity,IQueryable和IEnumerable都是延迟执行的,它们之间的区别仅仅在于扩展方法的参数类型不同。(迭代/枚举方式不同?作用对象不同?)IQueryable 和 IEnumerable 的区别IQueryable:扩展方法接受的是Expre转载 2021-09-04 14:33:10 · 1510 阅读 · 0 评论 -
C#(.NET Core) 泛型<T>中协变(covariant)和逆变(contravariant)的使用
泛型很有用,可减少代码,更好得复用代码。本文主要介绍一下C#(.NET Core) 泛型中使用协变(covariant)和逆变(contravariant)的方法,及使用的示例代码。1、泛型中协变(covariant)简单来说,协变用法是只能放在接口或者委托的泛型参数前面,是用来修饰返回值。具体使用如下代码:/// <summary>/// out 协变 只能是返回结果/// </summary>/// <typeparam name="T"></typ转载 2021-09-04 14:08:24 · 479 阅读 · 0 评论 -
子类能否重写父类的静态方法?
今天在看到了一道面试题,题目是一道代码阅读题,问下面的代码输出结果是什么?我最开始的理解:上面的代码我们可以看到,上面的类中有两个内部类Sub和Super,Sub继承了Super,Sub类重写了父类Super的getType方法,这是一个静态方法;而在main方法中创建了一个Super变量指向了一个子类Sub对象,并调用了其getType方法。按照多态的原理,这个变量调用的应该是子类的getType方法,也就是会得到三个字符串“Sub”,但是结果并非如此,结果如下:这个结果是调用了三次父类Supe转载 2021-09-03 00:56:57 · 2422 阅读 · 2 评论 -
关于构造函数及参数执行顺序说明(c#)
以前自己对这方面的内容一直比较模糊,只是知道一个大概的顺序,具体确切的执行顺序不能确定,于是抽空做了一个详细的测试,对其进行一番研究.具体的程序代码比较简单,如下所示.三个类分开来写的,一个父类,一个子类,一个测试类:父类:using System;namespace TestInherit{ public class Father { public int father_a=111; public int father_aa=1111; public readonly int转载 2021-08-30 23:38:36 · 4247 阅读 · 2 评论 -
.NET(C#) Nullable(可空类型)通过扩展方法传委托参数调用方法
1、可空类型介绍及使用正常情况下,值类型是不为null,必须有值,而可空类型可以理解成一种特殊的值类型,可以为null,比如,int? a=1;a=null;中a变量是int类型并且可以为null。常用的值类型:byte,short,int,long,float,double,decimal,char,bool,enum 和struct。可空类型的使用示例代码如下:using System;using System.Collections.Generic;using System.Linq;us转载 2021-08-29 14:38:10 · 952 阅读 · 0 评论 -
C#静态类的继承等疑惑解答
1.静态类可以从静态类中派生吗?静态类不允许从静态类中进行派生,也不允许从非静态类中派生,静态类必须从对象派生(个人觉得可能静态类不允许继承类),不允许有非静态的构造函数。 下面代码会报错 public static class staFun { static staFun() { Console.WriteLine("this is staFun"); } } public static class转载 2021-08-29 14:27:16 · 1889 阅读 · 0 评论 -
C# 字段、属性和成员变量的区别
我们先来写一个类Person,字段为:name、age、sex,属性:Name、Age、Sex。那么,成员变量:name、age、sex、Name、Age、Sex。字段和属性,都可以叫做是成员变量。属性和字段都是用来存储数据的,但肯定是有不同的public class Person{ // 字段 private string name; private int age; private string sex; // 属性 public string Nam转载 2021-08-27 19:25:32 · 1700 阅读 · 0 评论 -
C#中类静态成员的继承(注:static知识是wpf依赖项属性的基础,wpf开发者必须得掌握)
c#中静态的字段或方法,是可以被子类继承的。但是,存在如下问题需要注意:(1)子类继承的字段,并不属于子类,仍然属于父类。(2)在子类中修改了父类的静态字段,则父类的静态字段就确实被改了。(3)在子类中可以用同名的静态字段覆盖父类的静态字段,但是不能使用virtual和override关键字。不过,vs中在子类中会给出警告提示,但确实可以正确运行。(4)在子类的实例方法中可以直接操作父类的静态字段,而无需用“父类类名.字段名”的调用方法。但是,当子类中具有同名的静态字段覆盖了父类的静态字段时,如果转载 2021-08-23 01:08:28 · 1304 阅读 · 0 评论 -
C#中使用HttpClient来Post数据的内容HttpContent的各种格式
平时使用各种网络传输的时候基本上是以Json格式进行的, 所以对其他几种格式也是一知半解, 今天静下心对其好好梳理一番.首先我借鉴了一篇文章(https://segmentfault.com/a/1190000014343759), 和大多数资料一样, 他将类型分为四大类application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml.我把他的介绍Copy了过来, 这几种确实挺常用的, 但是个人而言转载 2021-08-22 20:31:26 · 5798 阅读 · 0 评论 -
C#判断泛型类型(List<>)和泛型接口(IEnumerable<>)的继承关系
本文主要介绍.NET(C#)中,判断某个泛型类型与泛型接口之间继承关系的代码,.NET中没有直接的方法判断。1、通过IsAssignableFrom()方法判断的问题var type1 = typeof(List<>);var type2 = typeof(IEnumerable<>);//return falsetype2.IsAssignableFrom(type1);//通过IsAssignableFrom()方法判断,方法返回是false,判断不出来它们之间的继承转载 2021-08-16 00:47:05 · 1947 阅读 · 0 评论 -
基于接口而非实现编程
【面向对象】基于接口而非实现编程如何解读原则中的“接口”二字?“接口”在不同的应用场景下会有不同的解读,比如服务端与客户端之间的“接口”,类库提供的“接口”,甚至是一组通信的协议都可以叫作“接口”。刚刚对“接口”的理解,都比较偏上层、偏抽象,与实际的写代码离得有点远。如果落实到具体的编码,“基于接口而非实现编程”这条原则中的“接口”,可以理解为编程语言中的接口或者抽象类。“基于接口而非实现编程”这条原则的另一个表述方式,是“基于抽象而非实现编程”。后者的表述方式其实更能体现这条原则的设计初衷。在软件转载 2021-07-10 14:22:32 · 270 阅读 · 0 评论 -
C# HttpClient教程
C# HttpClient教程展示了如何使用 C# 中的HttpClient创建 HTTP 请求。 在示例中,我们创建简单的 GET 和 POST 请求。超文本传输协议(HTTP)是用于分布式,协作式超媒体信息系统的应用协议。 HTTP 是万维网数据通信的基础。HttpClient是用于从 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。C# HttpClient状态码HTTP 响应状态代码指示特定的 HTTP 请求是否已成功完成。 响应分为五类:信息响应(100–199转载 2021-07-04 23:29:22 · 7406 阅读 · 1 评论 -
泛型的约束理解
1.引用类型约束struct RefSample where T:class 引用类型用Class表示约束,其他的引用类型为具体的约束。表示对于的约束必须为一个类(引用类型)不能是值类型(int,char,datatime,struct),可以是接口interface区分,数组为引用类型,因为定义数组时需要new出一个对象。虽然定义成 RefSample 传入的必须为引用类型 但是RefSample仍然为值类型2.值类型约束class ValSample where T:stru转载 2021-07-03 23:49:35 · 286 阅读 · 0 评论 -
public interface IBaseService<T> where T:class, new()含义
泛型参数约束 主要用在基类上或者接口上IBaseService<T> where T:class 表示类型变量(参数,子类) 必需要继承IBaseServiceIBaseService<T> where T:new() 表示类型变量 必需含有无参构造函数(默认或手动添加无参构造函数)public interface IRepository<T> where T : class,new (){bool AddEntity(T entity);bool Upda转载 2021-06-29 11:40:19 · 2293 阅读 · 0 评论 -
C# 8.0的新功能一:switch表达式
使用switch语句时,使用switch表达式可以编写更少的代码行。如果您有一个switch语句根据输入来设置/返回一个值,这将很有用。在C#8之前,可以使用以下代码将int转换为其等效的字符串:string word;switch (number){ case 1: word = "one"; break; case 2: word = "two"; break; case 3: word =转载 2021-06-27 00:14:15 · 2413 阅读 · 0 评论 -
温故之.NET进程间通信——管道
进程间传递数据,常见的有以下几种方式:管道:包括命名管道和匿名管道,这篇文章将讲解这种方式内存映射文件:借助文件和内存空间之间的映射关系,应用(包括多个进程)可以直接对内存执行读取和写入操作,从而实现进程间通信Socket:使用套接字在不同的进程间通信,这种通信方式下,需要占用系统至少一个端口SendMessage:通过窗口句柄的方式来通信,此通信方式基于 Windows 消息 WM_COPYDATA 来实现消息队列:在对性能要求不高的情况下,我们可以使用 Msmq。但在实际项目中,一般使用Ac转载 2021-04-06 16:14:37 · 1144 阅读 · 0 评论 -
C#基础知识之托管代码和非托管代码
什么是托管代码(managed code)托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行。编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。随着程序集的运行,CLR提供各种服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等。托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编转载 2021-04-06 15:51:41 · 2281 阅读 · 1 评论 -
C# Finalize和Dispose的区别
一:总结1、Finalize方法(C#中是析构函数,以下称析构函数)是用于释放非托管资源的,而托管资源会由GC自动回收。所以,我们也可以这样来区分 托管和非托管资源。所有会由GC自动回收的资源,就是托管的资源,而不能由GC自动回收的资源,就是非托管资源。在我们的类中直接使用非托管资源的情况很 少,所以基本上不用我们写析构函数。2、大部分的非托管资源会给系统带来很多负面影响,例如数据库连接不被释放就可能导致连接池中的可用数据库连接用尽。文件不关闭会导致其它进程无法读写这个文件等等。实现模型:1、由于大转载 2021-04-06 15:06:39 · 844 阅读 · 0 评论 -
C#中Base关键字的几种用法
base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。例如:2.1关于base调用基类构造函数public class A{ public A() { Console.WriteLine("Build A"); }}public class B:A{ public B():base() {转载 2021-01-31 15:41:00 · 389 阅读 · 0 评论 -
.NET Framework之File文件、Stream流
文件相关类文件操作常用相关类:类名说明File操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。Directory操作目录(文件夹),静态类。DirectoryInfo文件夹的一个“类”,用来描述一个文件夹对象(获取指定目录下的所有目录时返回一个DirectoryInfo数组。)FileInfo文件类,用来描述一个文件对象。获取指定目录下的所有文件时,返回一个FileInfo数组。Path对文件或目录的路径进行操作(很方便)【字符串】Str转载 2021-01-01 15:26:42 · 1671 阅读 · 0 评论 -
C# 集合 Collection
using SystemArrayArray 具有固定的容量。 若要增加容量,必须创建 Array 具有所需容量的新对象,将旧对象中的元素复制 Array 到新对象,并删除旧对象 Array 。关联性泛型集合类using System.Collection.GenericList<T>Dictionary<TKey,TValue>Dictionary<TKey,TValue> 的实现是一种典型的牺牲空间换取时间(双数组)。内部有两个数组,一个数组名为 buc转载 2020-12-28 20:05:51 · 560 阅读 · 0 评论 -
《CLR via C#》第二十六,二十七章
第二十六章《线程基础》windows为什么要支持线程线程开销停止疯狂CPU发展趋势CLR线程和Windows线程使用专用线程执行异步的计算限制操作使用线程的理由线程调度和优先级前台线程和后台线程26.1 windows为什么要支持线程当操作系统没有线程的概念的时候,整个计算机只运行一个执行线程(单核CPU),其中包括了操作系统和各种应用代码,一旦一个长时间运行的程序占用了线程,或者应用程序产生Bug开始了无限死循环,那整个机器就会被冻结,这个时候,网管都会过来告诉你,重启一下就好了转载 2020-12-04 09:18:26 · 265 阅读 · 0 评论 -
《CLR via C#》第五,六,七,八,九,十章
第五章《基元类型、引用类型、值类型》编程语言的基元类型引用类型和值类型值类型的装箱拆箱对象哈希吗dynamic基元类型5.1 编程语言的基元类型编译器直接支持的数据类型,在这里称之为基元类型,因为CLR对基元类型足够的了解,所以在执行对基元类型的对象的操作的时候,会比其余类型更加的迅速。在上表中,基元类型都是有对象FCL类型的,所以我们纠结string和String的时候就没有道理了,string会自动映射成FCL类型的String,所以两者是一样一样的5.1.1checked和un转载 2020-12-03 15:46:24 · 491 阅读 · 0 评论 -
《CLR via C#》第四章《类型基础》
所有类型都是都从System.Object派生类型转化命名空间和程序集运行时的相互转换4.1 所有类型都是都从System.Object派生在Coding中,任何类型都是继承于System.Object的,形如public class PhysicalGC : BaseCommand其实完整的写法应该是public class PhysicalGC : BaseCommand:System.Object既然继承了System.Object,那就代表了所有的类型的对象都是拥有该System.O.转载 2020-12-03 15:34:13 · 284 阅读 · 0 评论 -
《CLR Via C#》学习笔记(六)【方法参数相关(out ref params)】
通常我们在使用方法的时候,方法的参数是按值传递的,如果传递的参数是引用类型的对象,是将引用对象的地址传给方法。如果传递的是值类型实例,传递给方法的是该实例的一个副本。允许使用在方法中按引用来传递参数,C#中使用out和ref关键字来体现。下面就来介绍out和ref的使用。out1 使用out时在方法的参数定义和方法的调用时都要用out关键字,如下:static void Main(string[] args){ string name = string.Empty; GetStr(o转载 2020-12-01 14:09:21 · 232 阅读 · 0 评论 -
《CLR Via C#》学习笔记(五)【静态构造函数的性能】
在上一篇《CLR Via C# 学习笔记(4) 方法 构造函数 》中讲到了一些静态构造函数方面的知识,现在也回顾一下,大概总结如下:静态构造函数是私有的(private) ,而且不能人为去修改访问修饰符。静态构造函数不应该去调用基类的静态构造函数,因为静态字段不会被继承到子类。静态构造函数在一个类型中有且仅有一个,并且是无参的。静态构造函数中只能初始化静态字段。从上面的第一点可以知道静态构造函数都是private的,所以不能显示区进行调用,关于JIT何时会去生成调用静态构造函数的代码。存在着两转载 2020-12-01 14:05:47 · 204 阅读 · 0 评论 -
《CLR Via C#》学习笔记(四)【方法 构造函数】
构造函数是可以将类型实例初始化为有效状态的特殊方法。构造函数在元数据中通常用.ctor来表示,通过IL代码可以看到。在创建一个类型的实例时,通常分为三步:为实例的数据字段分配内存。创建对象指针和同步索引块。调用类型的实例构造器来设置对象的初始状态。引用类型的实例构造器在创建一个引用类型的对象是,调用类型的实例构造函数之前,会将对象分配的内存做清零处理,就是说在构造函数中没有显示赋值的所有字段都将设置为0或null。实例构造函数和一般方法不同,他永远都不能被继承,所有以下的关键字也不能用于实例转载 2020-12-01 14:02:46 · 242 阅读 · 0 评论