你可能不知道的C#特性

避坑指南:C# Record类型这些隐藏特性你可能不知道(附性能对比测试) 本文深入探讨了C# Record类型的隐藏特性,包括其独特的Equals行为、模式匹配优化、性能对比测试及实战应用场景。通过Benchmark.NET的实测数据,揭示了Record在内存分配和性能上的优势,帮助开发者避免常见陷阱并优化代码。 阅读详情
  • yield

通常用于迭代器中,向IEnumerable对象提供值或者结束迭代。

如:

yield return expression; yield break;
  • var

用于定义隐式类型的变量。

var i = 5; var s = "Hello";

注意隐式类型(Implicitly typed)并不是“动态类型“,由编译器在编译时候决定具体类型。

default除了在switch语句中提供默认的条件之外,还作为关键字用于泛型中。比如:

T temp = default(T);

由于事先不知道T类型是引用还是值类型,无法用于和null(只有引用类型可以)或者数字(值类型才能和其比较)进行比较。用default关键字,会确保如果是引用类型则返回null,如果是值类型则返回0。

关键字global::用于引用全局命名空间。

class TestClass : global::TestApp { }

用于多线程中表示这个字段可以由多个同时执行的线程修改。更多有关如何使用volatile多线程的例子,可以参考如何:创建和终止线程。

public volatile int i;
  

    C#中可以用extern修饰符声明外部实现的方法。常用于Interop服务使用非托管代码与DllImport属性一起使用(同时要声明static),如:

    [DllImport("avifil32.dll")] private static extern voidAVIFileInit();

    C#中可以同时引用两个类型名完全相同的程序集(常见同一控件的多个版本),这时候使用外部命令行指定别名引用,比如:

    /r:GridV1=grid.dll /r:GridV2=grid20.dll

    在程序中使用它们的时候,需要用关键extern来引用它们:

    extern alias GridV1; extern alias GridV2;

    GridV1和GridV2会被引用进和全局命名空间同级别的额外空间,使用GridV1::Grid或者GridV2::Grid可以得到不同版本的Grid类型。

     

    语法

    • ??操作符

    null合并运算符,用于定义可以为null值的引用类型的默认值。如果左操作数不为null,则返回左操作数,反之返回右操作数。

    int y = x ?? -1;

    同时这里也是null运算符:

    static int? GetNullableInt() { return null; } //... or int? x =null;
    • where T:new()

    我们知道可以用where关键字来对泛型定义进行约束,比如:

    public class MyClass<T, U> where T : class where U : struct {}

    同时我们可以对泛型定义中包含构造函数的约束,new()约束告诉编译器提供的任何类型的参数都含有一个无参数的(默认)构造方法。

    public class MyGenericClass<T> where T : IComparable, new() { T item = new T(); }

    语言特性

    • Nullable类型

    当我们要描述一个值类型可以不存在的的时候,使用nullable类型取代值类型。

    使用?修饰符来声明一个nullable类型,比如:

    int? a = 1;

    C#通过Nullable类和Nullable结构体来支持nullable类型,Nullable结构体含有两个有用属性HasValue和Value来判断和获取当前类型是否还有值。

    这个名词对.NET的朋友可能有点生疏,wikipedia给的翻译是“柯里化”- 个人不太喜欢这个名字,英文是currying。curry化是函数式编程的一种实现技术。大致过程,就是把本来接受多个参数的函数,变成只有第一个参数的函数,然后返回新函数接受余下的参数。有点拗口,而且对函数式编程或curry化介绍的中文资料也相对较少,我读过一篇对函数式编程和curry化解释的比较清楚的文章还有这篇英文的博客,推荐大家看看。

    所有能实现闭包的语言都可以实现curry化。在C#2.0中可以通过匿名委托来实现,在3.0中curry化相对简单一些:

    static class Program { static Func<TArg1, Func<TArg2, TResult>> Curry<TArg1, TArg2, TResult>(this Func<TArg1,
    TArg2, TResult> f) { return a1 => a2 => f(a1, a2); } static voidMain() { Func<int, int, int> add = (x, y) => x + y; var curriedAdd = add.Curry(); Console.WriteLine(curriedAdd(13)(29)); } }

    最后,如果大家对用C#实现函数式编程有兴趣,可以在MSDN Code中找到更多的代码实现。

    • 匿名类型

    匿名类型可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名称由编译器生成,并且不能在源代码级使用,类型也由编译器推断决定。常和LINQ查询表达式的select子句结合使用,初始化其他类型的属性组成的对象。

    var productQuery = from prod in products select new { prod.Color, prod.Price }; //创建由Color和Price属性组成的新对象
    foreach (var v in productQuery) { Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price); }
    • 扩展方法

      C#3.0中可以对CLR扩充类型,比如,你可能需要得到一句英文字符串中有多少个单词,以往可以写一个处理string的方法,现在你可以直接为string类型添加一个计算单词数量的方法:
    namespace ExtensionMethods { public static class MyExtensions {public static int WordCount(this String str) { returnstr.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } }

     

    通过this我们把这个WordCount方法扩充到了CLR内置类型,你可以直接像用普通方法一样使用它:

    using ExtensionMethods; //... string s = "Hello Extension Methods"; int i = s.WordCount();

    更多介绍可以参考MSDN或者ScottGu的博客。

     

    方法和属性

    • List.ForEach()

    Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作。如:

    List<String> names = new List<String>(); names.Add("Bruce"); names.Add("Alfred"); names.ForEach(Print); names.ForEach(delegate(String name) { Console.WriteLine(name); });private static void Print(string s) { Console.WriteLine(s); }
    • GetValueOrDefault

    对于nullable类型的对象,除了Value和HasValue两个常用属性外,还可以使用GetValueOrDefault方法来获得当前值或者默认值:

    float? mySingle = 12.34f; float? yourSingle = -1.0f; yourSingle = mySingle.GetValueOrDefault(-222.22f); // yourSingle=12.34 mySingle = null; yourSingle = mySingle.GetValueOrDefault(); // yourSingle=0

     

    C#—【特性详解以及自定义特性和通过反射读取特性】 目录C#—【特性详解以及自定义特性和通过反射读取特性特性的主要用途(举一些直观例子)1. 标记代码,让框架自动处理2. 数据验证(表单/模型校验)3. 控制序列化行为4. 生成文档(如API接口说明)5. 实现AOP(面向切面编程)为什么用特性而不用其他方法?日常开发中的高频场景一句话总结常见预定义特性(Predefined Attributes)示例代码自定义特性(Custom Attribute)一、如何定义自定义特性?二、如何应用自定义特性?三、如何通过反射读取特性?总结自定义特性和反射的应用实例。 阅读详情

    相关推荐

    洛谷P5707 【深基2.例12】上学迟到(c语言)

    第一篇题解 题目描述 yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s\le 10000)s(s≤10000) 米,而 yyy 可以以 v(v<10000)v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。 输入格式 两个正整数 s,v,意思已经在题目中给定

    cc_love_program的博客 1万+

    c#:从http请求报文看http协议中参数传递的几种方式

    环境: vs2019 16.5.1 asp.net core 3.1.1 Postman v7.14.0 一、在url中传递数据 这种方式适用于get/post方法,也是一种最简单、最直观的参数传递方式,不过由于过于直观(数据显示在浏览器地址栏中),不建议使用此种方式传递敏感数据。 http请求示例: GET http://localhost:5000/Test/TestUrlPara?nam...

    火焰 5818

    Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

    本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

    weixin_29230901的博客 335

    关于做完 C# 项目的问题总结 2

    c#

    m0_74772114的博客 796

    UFS 功能描述:UFS boot

    UFS 启动过程介绍:启动配置,启动代码下载过程和安全性

    m0_51720747的博客 1601

    逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路

    本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。

    f6g7h8i9j的博客 731

    C# 读取QueryString全部数据并输出的代码

    把写内容过程中经常用到的内容段珍藏起来,下面的资料是关于C# 读取QueryString全部数据并输出的内容。 using System.Collections; using System.Collections.Specialized; ... NameValueCollection collection = Request.QueryString; String[] keyArray =...

    daimayua的博客 2794

    一文看懂分布式存储架构

    目录一、集中存储结构二、分布式存储1 、分布式存储的兴起2 、分布式存储的重要性3 、分布式存储的种类和比较三、分布式理论浅析1 、一致性和可用性2 、数据分布3 、复制4 、分布式协议5、跨机房部署四、分布式文件系统1、 Google 文件系统( GFS )2、 Taobao 文件系统( TFS )3、 Fackbook Haystack 文件系统4、 CDN 内容分发网络五、分布式键值系统1、 Amazon Dynamo2、 Taobao Tiar3、 ETCD4 、产品选型比较( Etcd , Zoo

    weixin_70730532的博客 2万+

    C# form querystring()的区别

    这几天在写一个网站 先分析了一下别人写的一个不错的网站 发现Request 里面有两个取字符串的方式 一种是Request.Form[取字符的名称]; 一种是Request .QueryString[取字符的名称]; Request.Form() Request.Que

    chaojimaipian的专栏 728

    claude code desktop中出现Doesn‘t look like an Anthropic model - expected a gateway model route 解决方案

    本文主要介绍了claude code desktop中出现Doesn’t look like an Anthropic model - expected a gateway model route referencing an Anthropic model和Server is busy. Retrying的解决方案,希望能对使用claude code desktop的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

    weixin_43178406的博客 9万+

    2、硬件工程师笔试面试汇总(2025版本)

    本文摘要:文章系统梳理了硬件工程师笔试面试中的电子元器件知识要点,涵盖电阻、电容、电感、二极管、三极管、MOS管等器件的工作原理、选型要点和应用场景。详细解析了UART、I2C、SPI等通信协议的特点及实现方式,并探讨了电源管理、信号处理、PCB设计等核心问题。针对常见电路如放大电路、滤波电路、逻辑电路等提供了深入分析,同时介绍了示波器使用、单片机系统设计等实用技能。文章还包含器件封装、电平转换、时序分析等工程实践内容,并附有相关真题解析和仿真实验指导,为硬件工程师提供全面的技术参考。

    XU157303764的博客 9011

    C#+AE 属性查询

    “增删改查”作为GIS最为重要且基本的功能,是每一个想要学习Arcgis Engine的人都要走过的必经之路。在这其中,“查询统计”作为GIS的基本功能之一,它可以通过基于属性信息与空间关系的查询,能够提取符合我们条件的空间数据,为我们后续的信息分析和应用提供基础。

    dayuhaitang1的博客 5188

    Open3D——平面点云凸多边形轮廓提取【2025最新版】

    平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

    点云侠的博客 6754

    你可能不知道的C#语言特性

    关键字 yield 通常用于迭代器中,向IEnumerable对象提供值或者结束迭代。 如: yield return expression; yield break; var 用于定义隐式类型的变量。 var i = 5; var s = "Hello"; 注意隐式类型(Im...

    weixin_33754913的博客 164

    Data-Structures-and-Algorithm-Analysis-in-Java.pdf

    作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

    Camera2Demo

    在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

    C# String 类型:那些你可能不知道的秘密

    字符串应该是所有编程语言中使用最频繁的一种基础数据类型。在 C# 中,String 是一个相当特别的存在,它是引用类型,存储在托管堆中,但在应用上,它却表现得像是值类型。这个看似简单的类型,背后藏着不少的小秘密呢!你想知道吗?点开看看吧!今天咱们来聊一聊这个看似简单却充满玄机的 String 类型。

    yangshuquan的专栏 1320

    VC中sqlite的使用

    在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

    【C#进阶】C# 特性

    关于编程语言 C# 特性的介绍。

    好学若饥,谦卑若愚。 5755

    Devexpress16.2.6破解工具

    Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

    你不知道的javascript

    最近笔者使用node.js完成了一个小型项目,在javascript的泥坑里面摸爬滚打了一番,感触颇深。Javascript会给习惯于传统面向对象模式的开发人员,带来很多意想不到的障碍。这些问题基本上是因为误解了javascript的设计导致的。 如果有本书能把js的这些槽点、另类之处,一次性说个明白就好了。还真是有,图灵就出版了一本《你不知道的javascript》。 图灵出版的这本《你不知道的javascript》三卷。 https://pan.baidu.com/s/1K2dW_syvf5LFDJYF

    weixin_35597398的博客 5316

    详谈C#特性及应用

    详谈C#特性

    菜鸟厚非 1万+

    你可能不知道的 JS 特性:可选链

    今天我们来介绍一个你可能没见过的 JS 新特性,目前处于 Stage 3 阶段,它叫作可选链(optional chaining),它可能解决很多人都面对过的痛点,让我们来了解下~为什...

    yuqing1008的博客 1741

    这13个C# 特性你可能一直在用错

    摘要:文章总结了13个C#开发中常见的高频误区,包括async/await误用、var滥用、LINQ副作用、资源未释放等问题。这些问题往往因开发者对特性理解不足或使用随意导致,虽不会立即引发故障,但会随着系统规模扩大演变为性能隐患。作者通过真实案例(如文件句柄泄漏导致下载变慢)强调正确使用语言特性的重要性,建议开发者深入理解每个特性的设计初衷,避免因滥用特性带来潜在风险。

    软件开发学习交流 711

    C#最新语言特性

    近几年持续引入多个新特性以提升开发效率和代码质量,截至今年2025年2月,C#的最新稳定版本是C#13,它是在2024年11月发布的,下方是一些C#13中的新特性以及近期版本特性。

    C6666888的博客 3082

    你可能不知道的10个Blazor功能

    目录 介绍 .NET 5和C# 9 Markdown gRPC GraphQL EF Core和Azure Cosmos DB 渐进式网络应用程序 CSS隔离 虚拟化 服务器端预渲染 热重载 介绍 Blazor仍然是一项相对年轻的技术,但自2018年发布以来,它获得了令人难以置信的发展势头。Blazor最初是一个实验性项目,现在作为.NET 5的一部分发布,并被认为可以投入生产。 它对.NET开发人员的主要吸引力在于,他们可以使用自己喜欢的语言(如C#)编写单页应用程序,重用现有

    寒冰屋的专栏 7157
    上一篇: NameValueCollection详解
    下一篇: 白话C#:特性
    汶津
    博客等级 码龄20年 13粉丝 19原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值