Top 15 不起眼却有大作用的 .NET功能集
目录
1. ObsoleteAttribute
2. 设置默认值属性: DefaultValueAttribute
3. DebuggerBrowsableAttribute
4. ??运算符
5. Curry 及 Partial 方法
6. WeakReference
7. Lazy
8. BigInteger
9. 非官方关键字:__arglist __reftype __makeref __refvalue
10. Environment.NewLine
11. ExceptionDispatchInfo
12. Environment.FailFast
13. Debug.Assert, Debug.WriteIf 及 Debug.Indent
14. Parallel.For 及 Parallel.Foreach
15. IsInfinity方法
本文介绍了.Net 常被忽略,但却非常有用户的15个功能,包含ObsoleteAttribute,DefaultValueAttribute,DebuggerBrowsableAttribute,?运算符,Curry 及 Partial 方法…
1. ObsoleteAttribute
ObsoleteAttribute: 可适用于除程序集、模块、参数或返回值以外的所有程序元素。将元素标记为 Obsolete 可实现通知用户的功能,表明该元素在产品之后的新版本中会被移除。
Message属性包含一个字符串,可获取变通方法消息,是对可选程序元素的说明。
IsError属性:是Bool 类型,如果将值设为“True”,则编译器会将使用已过时的程序元素视为错误。
1: public static class ObsoleteExample
2: {
3: // Mark OrderDetailTotal As Obsolete.
4: [ObsoleteAttribute("This property (DepricatedOrderDetailTotal) is obsolete. Use InvoiceTotal instead.", false)]
5: public static decimal OrderDetailTotal
6: {
7: get
8: {
9: return 12m;
10: }
11: }
12:
13: public static decimal InvoiceTotal
14: {
15: get
16: {
17: return 25m;
18: }
19: }
20:
21: // Mark CalculateOrderDetailTotal As Obsolete.
22: [ObsoleteAttribute("This method is obsolete. Call CalculateInvoiceTotal instead.", true)]
23: public static decimal CalculateOrderDetailTotal()
24: {
25: return 0m;
26: }
27:
28: public static decimal CalculateInvoiceTotal()
29: {
30: return 1m;
31: }
32: }
如果运行程序,编译器就会报错以及Warning。
1: Console.WriteLine(ObsoleteExample.OrderDetailTotal);
2: Console.WriteLine();
3: Console.WriteLine(ObsoleteExample.CalculateOrderDetailTotal());
2. 通过“DefaultValueAttribute”属性可设置缺省值
DefaultValueAttribute 指定属性的默认值。可以使用任何值创建 DefaultValueAttribute。成员的默认值通常是其初始值。可视化设计器可以使用默认值重置成员的值。代码生成器也可使用默认值确定是否为成员生成代码,但是必须在成员函数中设置初始值。
1: public class DefaultValueAttributeTest
2: {
3: public DefaultValueAttributeTest()
4: {
5: // Use the DefaultValue propety of each property to actually set it, via reflection.
6: foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(this))
7: {
8: DefaultValueAttribute attr = (DefaultValueAttribute)prop.Attributes[typeof(DefaultValueAttribute)];
9: if (attr != null)
10: {
11: prop.SetValue(this, attr.Value);
12: }
13: }
14: }
15:
16: [DefaultValue(25)]
17: public int Age { get; set; }
18:
19: [DefaultValue("Anton")]
20: public string FirstName { get; set; }
21:
22: [DefaultValue("Angelov")]
23: public string LastName { get; set; }
24:
25: public override string ToString()
26: {
27: return string.Format("{0} {1} is {2}.", this.FirstName, this.LastName, this.Age);
28: }
29: }
3. DebuggerBrowsableAttribute
表示成员是否在Debugger 变量窗口显示以及如何显示。
1: public static class DebuggerBrowsableTest
2: {
3: private static string squirrelFirstNameName;
4: private static string squirrelLastNameName;
5:
6: // The following DebuggerBrowsableAttribute prevents the property following it
7: // from appearing in the debug window for the class.
8: [DebuggerBrowsable(DebuggerBrowsableState.Never)]
9: public static string SquirrelFirstNameName
10: {
11: get
12: {
13: return squirrelFirstNameName;
14: }
15: set
16: {
17: squirrelFirstNameName = value;
18: }
19: }
20:
21: [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]
22: public static string SquirrelLastNameName
23: {
24: get
25: {
26: return squirrelLastNameName;
27: }
28: set
29: {
30: squirrelLastNameName = value;
31: }
32: }
33: }
逐步调试程序时,就会发现代码会一直在执行:
1: DebuggerBrowsableTest.SquirrelFirstNameName = "Hammy";
2: DebuggerBrowsableTest.SquirrelLastNameName = "Ammy";
4. ??操作符
?? 运算符称作 null 合并运算符。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数,如果在尝试将可以为null 值的类型分配给不可以为null值的类型时,没有使用??运算符,则会生成编译时的错误。如果使用强制转换,且当前未定义可以为 null 值的类型,则会引发 InvalidOperationException 异常。
1: int? x = null;
2: int y = x ?? -1;
3: Console.WriteLine("y now equals -1 because x was null => {0}", y);
4: int i = DefaultValueOperatorTest.GetNullableInt() ?? default(int);
5: Console.WriteLine("i equals now 0 because GetNullableInt() returned null => {0}", i);
6: string s = DefaultValueOperatorTest.GetStringValue();
7: Console.WriteLine("Returns 'Unspecified' because s is null => {0}", s ?? "Unspecified");
5. Curry 及 Partial 方法
Curry 方法是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
1: public static class CurryMethodExtensions
2: {
3: public static Func<A, Func<B, Func<C, R>>> Curry<A, B, C, R>(this Func<A, B, C, R> f)
4: {
5: return a => b => c => f(a, b, c);
6: }
7: }
如果无法确定成员函数的返回类型可使用Var执行。
Partial—Partial类型允许我们将一个类、接口或结构分成好几个部分,分别实现在几个不同的.cs文件中。关键字partial是一个上下文关键字,只有和class、struct、interface放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
1: public static class CurryMethodExtensions
2: {
3: public static Func<C, R> Partial<A, B, C, R>(this Func<A, B, C, R> f, A a, B b)
4: {
5: return c => f(a, b, c);
6: }
7: }
6. WeakReference
Weak Reference 表示类型化弱引用,即在引用对象的同时仍然允许垃圾回收来回收该对象。如果你想使用该引用,可以设置为强引用类型,保证该对象不被回收。
1: WeakReferenceTest hugeObject = new WeakReferenceTest();
2: hugeObject.SharkFirstName = "Sharky";
3: WeakReference w = new WeakReference(hugeObject);
4: hugeObject = null;
5: GC.Collect();
6: Console.WriteLine((w.Target as WeakReferenceTest).SharkFirstName);
7. Lazy<T>
Lazy<T>提供对延迟一些大资源或资源紧张的对象的初始化的支持。在程序的生存期内,特别是在这种方式创建或执行可能不发生使用延迟初始化延迟一种或大量占用资源的对象的创建、资源的任务的执行。
1: public abstract class ThreadSafeLazyBaseSingleton<T>
2: where T : new()
3: {
4: private static readonly Lazy<T> lazy = new Lazy<T>(() => new T());
5:
6: public static T Instance
7: {
8: get
9: {
10: return lazy.Value;
11: }
12: }
13: }
8. BigInteger
BigInteger 类型 表示任意大的带符号整数。理论上来讲,该类型的数据是没有边界值限制的。该类型与其他整型类型不同,包含MinValue和MaxValue 属性。
1: string positiveString = "91389681247993671255432112000000";
2: string negativeString = "-90315837410896312071002088037140000";
3: BigInteger posBigInt = 0;
4: BigInteger negBigInt = 0;
5:
6: posBigInt = BigInteger.Parse(positiveString);
7: Console.WriteLine(posBigInt);
8: negBigInt = BigInteger.Parse(negativeString);
9: Console.WriteLine(negBigInt);
9. 未官方记录的 C# 关键字: __arglist __reftype __makeref __refvalue
第9条奖的关键字官方文档并没有记录,可能正在测试中。然而这些关键字丰富了Visual Studio 编辑器的功能,也能被识别。
开发人员可以使用__makeref关键字创建变量。使用__refvalue修饰变量可以从 TypedReference中获得变量值。__arglist关键字与params的作用相同,可以访问参数列表。
1: int i = 21;
2: TypedReference tr = __makeref(i);
3: Type t = __reftype(tr);
4: Console.WriteLine(t.ToString());
5: int rv = __refvalue( tr,int);
6: Console.WriteLine(rv);
7: ArglistTest.DisplayNumbersOnConsole(__arglist(1, 2, 3, 5, 6));
为了使用__arglist, 需要定义ArglistTest 类
1: public static class ArglistTest
2: {
3: public static void DisplayNumbersOnConsole(__arglist)
4: {
5: ArgIterator ai = new ArgIterator(__arglist);
6: while (ai.GetRemainingCount() > 0)
7: {
8: TypedReference tr = ai.GetNextArg();
9: Console.WriteLine(TypedReference.ToObject(tr));
10: }
11: }
12: }
10. Environment.NewLine
获取为此环境定义的换行字符串。
1: Console.WriteLine("NewLine: {0} first line{0} second line{0} third line", Environment.NewLine);
11. ExceptionDispatchInfo
表示捕获特定点的异常情况。可以使用ExceptionDispatchInfo.Throw 方法,命名空间为System.Runtime.ExceptionServices。
1: ExceptionDispatchInfo possibleException = null;
2:
3: try
4: {
5: int.Parse("a");
6: }
7: catch (FormatException ex)
8: {
9: possibleException = ExceptionDispatchInfo.Capture(ex);
10: }
11:
12: if (possibleException != null)
13: {
14: possibleException.Throw();
15: }
12. Environment.FailFast()
如果想退出程序,且不需要调用任何Finally 块或Finalizers,可以使用FailFast。
1: string s = Console.ReadLine();
2: try
3: {
4: int i = int.Parse(s);
5: if (i == 42) Environment.FailFast("Special number entered");
6: }
7: finally
8: {
9: Console.WriteLine("Program complete.");
10: }
13. Debug.Assert & Debug.WriteIf & Debug.Indent
Debug.Assert——检查条件;如果条件为 false,则显示一个消息框,其中会显示调用堆栈。Debug.Assert尽在调试版中有效,在发布版中如果要执行断言,则使用Trace.Assert。
Debug.Assert(1 == 0, "The numbers are not equal! Oh my god!");
如果Assert在Debug模式下失败,则会显示下图:
14. Parallel.For & Parallel.Foreach
多线程的情况下较为常用。
Parallel.For—执行循环,迭代可以运行。
1: int[] nums = Enumerable.Range(0, 1000000).ToArray();
2: long total = 0;
3:
4: // Use type parameter to make subtotal a long, not an int
5: Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
6: {
7: subtotal += nums[j];
8: return subtotal;
9: },
10: (x) => Interlocked.Add(ref total, x)
11: );
12:
13: Console.WriteLine("The total is {0:N0}", total);
Interlocked.Add 方法将两个整型值相加,并将结果保存到第一个数值,可以作为原子操作。
Parallel.Foreach——执行 foreach(在 Visual Basic 中为 For Each)操作,其中在 Partitioner 上可能会并行运行迭代。
15. IsInfinity
判断数值的正负情况。
Console.WriteLine(, Double.IsInfinity(3.0 / 0) ? : );原文链接:http://www.codeproject.com/Articles/1021335/Top-Underutilized-Features-of-NET
转载于:https://blog.51cto.com/powertoolsteam/1712185
相关文章:

M2 芯片终于要来了?全线换新,性能远超M1 Max
不知不觉日历已翻至 2 月下旬,掐指一算,距离苹果一年一度春季新品发布会的召开似乎已越来越近。根据年初统计的 2022 年苹果新品预测,预计今年的苹果“小春晚”将在 Mac 方面有大动作。 那么,苹果将如何“动作”,又…

Python抓取新浪新闻数据(三)
非同步载入一般在XHR下查找,但是没有发现XHR下有相关内容。 转载于:https://blog.51cto.com/2290153/2126862

不畏浮云遮望眼--离散数学和组合数学
不畏浮云遮望眼,基础很重要!离散数学是算法和数据结构的基础,而算法和数据结构又是什么的基础?不解释了。1.《离散数学及其应用》作者: (美)Kenneth H. R出版社: 机械工业出版社出版年: 2007-6页数: 804定价: 79.00元丛书: 计算机…

上班摸鱼,刚刚发现在 VScode 中可玩魂斗罗,超级玛丽
今天,再给大家介绍一款更加有意思的vscode插件——“小霸王”。 GitHub传送门:https://github.com/gamedilong/anes-repository 安装方式: 对于插件的安装,可以按照上图的操作流程。 1.打开VScode,然后点击拓展。 2.在输入框中&am…

JSP 三 :九大隐式对象
2019独角兽企业重金招聘Python工程师标准>>> ###细节 每个JSP页面在第一次被访问时,web容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方…
阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”
文/图 阿里安全潘多拉实验室 团控 编者按:团控,阿里安全潘多拉实验室研究人员,该实验室主要聚焦于移动安全领域,包括对iOS和Android系统安全的攻击和防御技术研究。团控的主攻方向为安卓系统级漏洞的攻防研究。在今年3月的BlackHa…

c语言模拟实现oc引用计数
#include<stdio.h> #include<stdlib.h> //在c中引入 引用计数机制 // 要解决的问题: 1,指向某块动态内存的指针有几个? // 应该让这块动态内存记录指针的数量 // 所以开辟的动态内存大小应该取多大? // …

ATT与Intel汇编语言的比较
转自 陈莉君 一书《深入分析Linux内核源码》 http://www.kerneltravel.net/kernel-book/第二章%20Linux运行的硬件基础/2.6.1.htm2.6.1 AT&T与Intel汇编语言的比较我们知道,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事…

最近,又发现了 Pandas 中三个好用的函数
作者 | luanhz来源 | 小数志导读近日,在github中查看一些他人提交的代码时,发现了Pandas中这三个函数,在特定场景中着实好用,遂成此文以作分享。程序的基本结构大体包含三种,即顺序结构、分支结构和循环结构࿰…

Java Web的Maven项目中Properties文件的使用(2)
为什么80%的码农都做不了架构师?>>> 背景 Java Web中常用一些Properties文件进行部署配置,其中如果在里面配置OS的路径,需要跨平台,主要就是考虑win系统的路径是“\”,而Linux的路径是“/”。 …

TCP/IP 计算机网络协议
2019独角兽企业重金招聘Python工程师标准>>> 应用层: (典型设备:应用程序,如FTP,SMTP ,HTTP) DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,使用 UDP 协议工作,主要有两个用途:给…

5分钟速通 AI 计算机视觉发展应用
作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 计算机视觉是进步最大、发展最快的领域之一。根据 Global VIEW 的研究,全球计算机视觉市场规模在 2020 的价值为 113 亿 2000 万美元,预计从2021 到 2028 的复合年增长率为 7.3%…

javascript解析json
下载json库 http://www.json.org/json-zh.html自己找javascript的 或者直接去下面的 https://github.com/douglascrockford/JSON-jsphp生成json格式使用页面 <script src"scripts/json.js"></script>alert(data.toJSONString());如果返回false说明没数据…
高德联手凯迪拉克 发布全球首个高精地图应用
6月13日,在CES ASIA活动现场,上汽通用汽车凯迪拉克超级智能驾驶系统(Super CruiseTM)在国内首发亮相,未来将搭载在凯迪拉克CT6 40T铂金版车型上推向市场。高德地图作为上汽通用汽车在华合作伙伴,将为超级智…

WinDbg安装与使用
WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。 主页:http://msdn.microsoft.com/en-us/windows/hardware/gg463016 下载链接:http://msdl.microsoft…

mysql-5.6 升级 5.7
#准备工作 1、停机 [rootlocalhost local]# /etc/init.d/mysqld stop Shutting down MySQL.. [确定]2、切换版本 [rootlocalhost local]# mv /root/mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz ./mysql-5.7 [rootlocalhost local]# ln -s…

让假图无所遁形,阿里篡改图像检测大赛集结号令打响
近年来,伴随多媒体技术的迅速发展,图像安全隐患随之而来。一些不法分子通过伪造或恶意篡改证件、政府文件、转账记录截图等方式,不仅进行诈骗活动,还带来一些社会问题:2 月 10 日,广西柳州融水苗族自治县赵…

Apache网页优化之网页压缩
Apache网页压缩技术 实验介绍:本实验在虚拟机的Linux系统上搭建http-2.4.2,并在配置过程中开启mod_deflate模块,实现网页的压缩功能,最终通过fiddler抓包工具,验证mod_deflate压缩是否生效。 1、首先将搭建httpd服务所需要的软件包…

推荐阅读的多核编程技术书籍
多核编程技术好书推荐 多核程序设计技术——通过软件多线程提升性能 , 作 者: (孟加拉)阿克特(Akhter,S.),(美)罗伯茨(Roberts,J.) 著…

zabbix监控windows(03,08)
监控windows主机:下载zabbix_agents_2.2.3.win.zip (zabbix官网下载)解压文件,把对应的文件(32位或者64位)考到C盘根目录(对应目录就OK)并带配置文件;编辑配置文件:zabbix_agentd.win.confLogFi…

Dubbo原理何源码解析之服务暴露
2019独角兽企业重金招聘Python工程师标准>>> 一、框架设计 在官方《Dubbo 用户指南》架构部分,给出了服务调用的整体架构和流程: 另外,在官方《Dubbo 开发指南》框架设计部分,给出了整体设计: 以及暴露服务…

维基百科上的算法和数据结构链接很强大
突然发现维基百科上的算法和数据结构比百度百科强多啦,图文并茂。 其实这个网站不错:http://www.sorting-algorithms.com 冒泡排序: bubble冒泡的意思http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F-------------------…

基于 OpenCV 的图像阴影去除
作者 | 努比来源 | 小白学视觉我们经常需要通过扫描将纸上的全部内容转换为图像。有很多在线工具可以提高图像的亮度,或者消除图像中的阴影。但是我们可以手动删除阴影吗?当然可以,我们只需要将图像加载到相应的代码中,无需任何应…

not exists 跟not in 纪念一下
转载于:https://www.cnblogs.com/zzzzw/p/4973378.html

jquery $.proxy使用 Jquery实现ready()的源码
jquery $.proxy使用 在某些情况下,我们调用Javascript函数时候,this指针并不一定是我们所期望的那个。例如: 1 //正常的this使用2 $(#myElement).click(function() {3 4 // 这个this是我们所期望的,当前元素的this.5 6 $(…

PHP session回收机制
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改&#x…

WPF学习拾遗(二)TextBlock换行
原文:WPF学习拾遗(二)TextBlock换行下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧。 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要来的比较少, 比较值得…

Meta 开发 AI 语音助手,用于创建虚拟世界和实时翻译
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) Meta 在近日的「用人工智能构建元宇宙」的讨论会上,展示了最新的 AI 黑科技 「Builder Bot」 ,并且在此次会议上 Meta 公布了关于构建元宇宙的人工智能计划,其中包括…

MySQL的基础
2019独角兽企业重金招聘Python工程师标准>>> 数据库和SQL 什么数据库 数据库是存储在一起的相关数据的集合,这些数据是结构化的,无有害的或不必要的冗余,并为多种应用服务。 什么是SQL 结构化查询语言(Structured Query Language)…

Python:Bug 官网不要了,全迁去 GitHub
近几年,GitHub 开发者数量逐年上升,仅过去一年 GitHub 的新增用户便有 1600 万人,总用户数更是达到了 7300 万——在开源浪潮席卷全球中,GitHub 无疑成为了许多开发者迈入开源的一个重要途径。 Python 开发团队或许正是看中了这一…