有关C#的15大顶级功能的第一个帖子是出现在Automate The Planet上。下面列出程序猿在C#编程生涯中最喜欢的C#功能,当然包括完整的解释和代码示例。
1. ObsoleteAttribute
ObsoleteAttribute适用于除组件,模块,参数和返回值的所有程序元素。标记过时元素,并通知用户该元件将在产品的未来版本中删除。
Message属性包含一个当assignee属性后将显示的字符串。
IsError-设置为true,如果在代码中使用目标属性。
public static class ObsoleteExample { // Mark OrderDetailTotal As Obsolete. [ObsoleteAttribute("This property (DepricatedOrderDetailTotal) is obsolete. Use InvoiceTotal instead.", false)] public static decimal OrderDetailTotal { get { return 12m; } } public static decimal InvoiceTotal { get { return 25m; } } // Mark CalculateOrderDetailTotal As Obsolete. [ObsoleteAttribute("This method is obsolete. Call CalculateInvoiceTotal instead.", true)] public static decimal CalculateOrderDetailTotal() { return 0m; } public static decimal CalculateInvoiceTotal() { return 1m; } }
如果我们在代码中使用上述类,系统将给出错误或警告。
Console.WriteLine(ObsoleteExample.OrderDetailTotal); Console.WriteLine(); Console.WriteLine(ObsoleteExample.CalculateOrderDetailTotal());
官方文档:https://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx
2.通过DefaultValueAttribute设置C# Auto-implemented属性默认值
DefaultValueAttribute指定了属性的默认值。你可以创建DefaultValueAttribute为任何价值,成员的默认值通常是它的初始值。
该属性不会导致成员被自动指定的值初始化。因此,你必须在代码中设置初始值。
public class DefaultValueAttributeTest { public DefaultValueAttributeTest() { // Use the DefaultValue propety of each property to actually set it, via reflection. foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(this)) { DefaultValueAttribute attr = (DefaultValueAttribute)prop.Attributes[typeof(DefaultValueAttribute)]; if (attr != null) { prop.SetValue(this, attr.Value); } } } [DefaultValue(25)] public int Age { get; set; } [DefaultValue("Anton")] public string FirstName { get; set; } [DefaultValue("Angelov")] public string LastName { get; set; } public override string ToString() { return string.Format("{0} {1} is {2}.", this.FirstName, this.LastName, this.Age); } }
Auto-implemented属性在类中通过反射构造函数初始化。代码通过类的所有属性进行迭代,并且如果DefaultValueAttribute存在,就将它们设置为默认值。
官方文档:https://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx
3. DebuggerBrowsableAttribute
确定成员是否以及如何显示在调试器变量窗口。
public static class DebuggerBrowsableTest { private static string squirrelFirstNameName; private static string squirrelLastNameName; // The following DebuggerBrowsableAttribute prevents the property following it // from appearing in the debug window for the class. [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static string SquirrelFirstNameName { get { return squirrelFirstNameName; } set { squirrelFirstNameName = value; } } [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)] public static string SquirrelLastNameName { get { return squirrelLastNameName; } set { squirrelLastNameName = value; } } }
如果你在代码中使用示例类,那么尝试通过调试器(F11)执行。
DebuggerBrowsableTest.SquirrelFirstNameName = "Hammy"; DebuggerBrowsableTest.SquirrelLastNameName = "Ammy";
官方文档:https://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerbrowsableattribute.aspx
4. ?? Operator
?? Operator是程序猿最喜欢的C#隐藏功能之一,经常在代码里用到它。
如果左边的操作数不为空,?? Operator返回左边的操作数,,否则将返回右边的。可空类型可以包含一个值,也可以是不确定的。当可空类型分配给非可空类型时?? Operator定义返回默认值。
int? x = null; int y = x ?? -1; Console.WriteLine("y now equals -1 because x was null => {0}", y); int i = DefaultValueOperatorTest.GetNullableInt() ?? default(int); Console.WriteLine("i equals now 0 because GetNullableInt() returned null => {0}", i); string s = DefaultValueOperatorTest.GetStringValue(); Console.WriteLine("Returns 'Unspecified' because s is null => {0}", s ?? "Unspecified");
官方文档:https://msdn.microsoft.com/en-us/library/ms173224(v=vs.80).aspx
5. Curry和Partial方法
Curry-在数学和计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
要想通过C#实现,就要用到Curry扩展方法。
public static class CurryMethodExtensions { public static Func<A, Func<B, Func<C, R>>> Curry<A, B, C, R>(this Func<A, B, C, R> f) { return a => b => c => f(a, b, c); } }
扩展方法的使用一开始是有点势不可挡的。
Func<int, int, int, int> addNumbers = (x, y, z) => x + y + z; var f1 = addNumbers.Curry(); Func<int, Func<int, int>> f2 = f1(3); Func<int, int> f3 = f2(4); Console.WriteLine(f3(5));
不同函数的返回类型可通过var关键字进行交换。
官方文档:https://en.wikipedia.org/wiki/Currying#/Contrast_with_partial_function_application
Partial - 在计算机科学中,部分应用程序(或部分功能的应用程序)是指固定的一些参数的函数,产生另一种更小参数数量功能的过程。
public static class CurryMethodExtensions { public static Func<C, R> Partial<A, B, C, R>(this Func<A, B, C, R> f, A a, B b) { return c => f(a, b, c); } }
Partial的扩展方法比Curry的更简单直观。
Func<int, int, int, int> sumNumbers = (x, y, z) => x + y + z; Func<int, int> f4 = sumNumbers.Partial(3, 4); Console.WriteLine(f4(5));
同样,不同类型的代理可通过var关键字来声明。
官方文档:https://en.wikipedia.org/wiki/Partial_application
6. Weak Reference
Weak Reference允许垃圾收集器收集对象,同时还允许应用程序访问的对象。如果需要该对象,仍可通过强引用获取,并防止它被收集。
WeakReferenceTest hugeObject = new WeakReferenceTest(); hugeObject.SharkFirstName = "Sharky"; WeakReference w = new WeakReference(hugeObject); hugeObject = null; GC.Collect(); Console.WriteLine((w.Target as WeakReferenceTest).SharkFirstName);
如果垃圾收集没有被明确调用,跟有可能弱引用仍可被分配。
官方文档:https://msdn.microsoft.com/en-us/library/system.weakreference.aspx
7. Lazy<T>
使用延迟初始化推迟创建大型或资源密集型对象,或执行资源密集型任务,特别是在程序的生命周期内可能不会发生这样的创建或执行。
public abstract class ThreadSafeLazyBaseSingleton<T> where T : new() { private static readonly Lazy<T> lazy = new Lazy<T>(() => new T()); public static T Instance { get { return lazy.Value; } } }
官方文档:https://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx
8. BigInteger
BigInteger类型是一个不可变型,代表一个任意大的整数,其值在理论上是没有上限和下限的。这种类型不同于其它.NET Framework中的整型,它们有MINVALUE和MaxValue属性表示的范围。
注意:由于BigInteger的类型是不可改变并且没有上限或下限的,因此任何引起BigInteger值增长过大的操作都可能抛出OutOfMemoryException异常。
string positiveString = "91389681247993671255432112000000"; string negativeString = "-90315837410896312071002088037140000"; BigInteger posBigInt = 0; BigInteger negBigInt = 0; posBigInt = BigInteger.Parse(positiveString); Console.WriteLine(posBigInt); negBigInt = BigInteger.Parse(negativeString); Console.WriteLine(negBigInt);
官方文档:https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
点击查看>>更多
相关推荐
"C# 10 中文文档" C# 10 是最新的 C# 语言版本,提供了许多新的功能和改进。...本文档涵盖了 C# 10 的大部分内容,包括语言基础、面向对象的编程、并发编程、 LINQ 和查询、字符串和正则表达式等。
在C# WinForms开发中,`TreeView`控件是一种常用且功能强大的用户界面元素,用于展示具有层次结构的数据。在给定的代码片段中,我们可以看到一个基础的`TreeView`控件节点创建过程,尽管代码中包含了一些非标准字符...
开发者能够探索顶级语句、对象中的模式,以及C#不同版本的新特性,如C# 6的特性。文档还将探讨字符串内插的交互式和环境使用案例,并介绍高级方案,如使用默认接口方法来安全地更新接口。 C#的类型系统是其核心概念...
根据给定的信息,本文将详细解释C#中的正则表达式及其应用场景,特别是结合所提供的示例来阐述如何在C#程序设计中运用这些表达式。 ### C#与正则表达式 C#是一种广泛使用的面向对象编程语言,它支持丰富的功能,...
提供的源码文件"**C# WinForm在Panel中添加Form.txt**"和"**panel 放窗体+清空.txt**"应该包含了实现这一功能的具体代码,读者可以结合本文档的说明进行学习和实践。 总的来说,这种技术在开发复杂的桌面应用时非常...
- "C#" 插件:这是由Microsoft提供的,用于在VSCode中支持C#开发,包括语法高亮、智能感知等功能。 - "Icons" 插件:例如,Material Icon Theme,它为不同类型的文件提供视觉标识,便于识别项目中的文件。 接下来...
- **探索顶级语句**:讨论了最新C#版本中引入的顶级语句功能。 #### 四、进阶主题 - **探索对象中的模式**:讲解了如何利用模式匹配进行更复杂的类型检查和模式识别。 - **探索字符串内插**:深入分析了字符串内插...
《深入解析C# 第二版》是一本由世界顶级技术专家Jon Skeet撰写的经典著作,该书覆盖了C# 4.0语言的新特性和高级用法。作为C#领域的权威之作,它不仅适用于中级到高级开发者,对于想要深入了解C#内部机制的程序员来说...
在本文中,我们将深入探讨如何使用C#进行Kafka开发,以及如何实现数据同步。Kafka是一种高效的消息中间件,最初由LinkedIn开发,现在已成为Apache软件基金会的顶级项目。它被设计为支持高吞吐量、低延迟的消息传递,...
C#10.0的预览版5中,我们看到了记录类型、顶级语句等新功能的加入。这些新特性使得C#程序更简洁、易于维护。 ### 异常和错误处理 异常和错误处理部分介绍了如何使用try、catch和finally语句处理可能出现的错误。...
本文将深入探讨如何利用C#来获取系统托盘区域(也称为通知区域)的信息,包括显示在托盘区域中的图标以及它们所关联的进程ID。 系统托盘区域是Windows操作系统桌面右下角的一个区域,通常包含各种程序的小图标,如...
在C#中实现二级域名是一项常见...通过以上步骤,你就可以在C#中实现二级域名的完整功能。这个过程涉及到IIS配置、路由规则、中间件编程以及数据管理等多个方面,理解并掌握这些知识点对于构建可扩展的Web应用至关重要。
在C#编程中,遍历菜单是一项常见的任务,特别是在开发具有多级菜单的Windows应用程序时。递归是一种强大的编程技术,适用于处理具有层次结构的数据,如树形结构的菜单。本篇文章将深入探讨如何使用递归方法遍历C#中...
在C#开发中,有时我们需要调用系统的一些高级功能,比如打开一个文件、启动一个程序或发送邮件等操作。这些功能可以通过调用Windows API来实现,而`ShellExecute`就是其中一个非常实用的API函数。 #### ...
本教程将详细介绍如何在C#中实现这样的功能,适合初学者或者在设计用户界面时寻找灵感的开发者。 首先,你需要了解C#中的MenuStrip控件。MenuStrip是.NET Framework提供的一种用于创建菜单栏的控件,它可以容纳多个...
### C#实现下载大文件.pdf 的相关知识点 #### 核心概念与背景 - **ASP.NET**:一种用于构建动态Web应用程序的服务器端技术。它允许开发者使用C#等语言来编写网页逻辑,并且能够利用.NET框架的强大功能。 - **网络...
在IT行业中,编程语言C#提供了丰富的功能,其中包括与其它应用程序进行交互的能力。"C# findwindow及sendmessage外挂"这个主题就是关于如何利用C#的FindWindow和SendMessage这两个API函数来实现程序间的通信,尤其是...
### C# 中使用 XPath 的方法 #### XPath 介绍与应用场景 XPath 是一门功能非常强大的查询语言,用于在 XML 文档中查找信息。由于 XML 数据结构的复杂性,XPath 提供了一种灵活的方式来定位文档中的元素和属性。...