`
huang_xiaok
  • 浏览: 95916 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
90a30fc4-e2b0-37bf-a450-86cdba0caacc
Fusioncharts中...
浏览量:17109
文章分类
社区版块
存档分类

C#中15大顶级功能(1/2)

阅读更多

有关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());

 

C#警告示例

官方文档: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

 

点击查看>>更多

0
1
分享到:
评论

相关推荐

    c#10 中文文档 C#最新语法

    "C# 10 中文文档" C# 10 是最新的 C# 语言版本,提供了许多新的功能和改进。...本文档涵盖了 C# 10 的大部分内容,包括语言基础、面向对象的编程、并发编程、 LINQ 和查询、字符串和正则表达式等。

    c#中treeview控件节点图代码

    在C# WinForms开发中,`TreeView`控件是一种常用且功能强大的用户界面元素,用于展示具有层次结构的数据。在给定的代码片段中,我们可以看到一个基础的`TreeView`控件节点创建过程,尽管代码中包含了一些非标准字符...

    C# 9.0文档 中文版.pdf

    开发者能够探索顶级语句、对象中的模式,以及C#不同版本的新特性,如C# 6的特性。文档还将探讨字符串内插的交互式和环境使用案例,并介绍高级方案,如使用默认接口方法来安全地更新接口。 C#的类型系统是其核心概念...

    C#正则表达式集合C# 正则表达式 集合C# 正则表达式 集合C# 正则表达式 集合

    根据给定的信息,本文将详细解释C#中的正则表达式及其应用场景,特别是结合所提供的示例来阐述如何在C#程序设计中运用这些表达式。 ### C#与正则表达式 C#是一种广泛使用的面向对象编程语言,它支持丰富的功能,...

    C# WinForm 在Panel中添加Form 教程+源码

    提供的源码文件"**C# WinForm在Panel中添加Form.txt**"和"**panel 放窗体+清空.txt**"应该包含了实现这一功能的具体代码,读者可以结合本文档的说明进行学习和实践。 总的来说,这种技术在开发复杂的桌面应用时非常...

    vscode配置C#环境 2022

    - "C#" 插件:这是由Microsoft提供的,用于在VSCode中支持C#开发,包括语法高亮、智能感知等功能。 - "Icons" 插件:例如,Material Icon Theme,它为不同类型的文件提供视觉标识,便于识别项目中的文件。 接下来...

    MSDN离线版C# 脚本手册 C# 指南.pdf

    - **探索顶级语句**:讨论了最新C#版本中引入的顶级语句功能。 #### 四、进阶主题 - **探索对象中的模式**:讲解了如何利用模式匹配进行更复杂的类型检查和模式识别。 - **探索字符串内插**:深入分析了字符串内插...

    C# in Depth, 2nd Edition(深入解析C# 第二版)

    《深入解析C# 第二版》是一本由世界顶级技术专家Jon Skeet撰写的经典著作,该书覆盖了C# 4.0语言的新特性和高级用法。作为C#领域的权威之作,它不仅适用于中级到高级开发者,对于想要深入了解C#内部机制的程序员来说...

    C#kafka开发实例

    在本文中,我们将深入探讨如何使用C#进行Kafka开发,以及如何实现数据同步。Kafka是一种高效的消息中间件,最初由LinkedIn开发,现在已成为Apache软件基金会的顶级项目。它被设计为支持高吞吐量、低延迟的消息传递,...

    C#学习(微软原版2021).pdf

    C#10.0的预览版5中,我们看到了记录类型、顶级语句等新功能的加入。这些新特性使得C#程序更简洁、易于维护。 ### 异常和错误处理 异常和错误处理部分介绍了如何使用try、catch和finally语句处理可能出现的错误。...

    C#获取系统托盘信息

    本文将深入探讨如何利用C#来获取系统托盘区域(也称为通知区域)的信息,包括显示在托盘区域中的图标以及它们所关联的进程ID。 系统托盘区域是Windows操作系统桌面右下角的一个区域,通常包含各种程序的小图标,如...

    c#中实现二级域名完整示例

    在C#中实现二级域名是一项常见...通过以上步骤,你就可以在C#中实现二级域名的完整功能。这个过程涉及到IIS配置、路由规则、中间件编程以及数据管理等多个方面,理解并掌握这些知识点对于构建可扩展的Web应用至关重要。

    c#用递归方法菜单遍历

    在C#编程中,遍历菜单是一项常见的任务,特别是在开发具有多级菜单的Windows应用程序时。递归是一种强大的编程技术,适用于处理具有层次结构的数据,如树形结构的菜单。本篇文章将深入探讨如何使用递归方法遍历C#中...

    C#中使用API函数ShellExecute源码

    在C#开发中,有时我们需要调用系统的一些高级功能,比如打开一个文件、启动一个程序或发送邮件等操作。这些功能可以通过调用Windows API来实现,而`ShellExecute`就是其中一个非常实用的API函数。 #### ...

    C#简单的折叠菜单

    本教程将详细介绍如何在C#中实现这样的功能,适合初学者或者在设计用户界面时寻找灵感的开发者。 首先,你需要了解C#中的MenuStrip控件。MenuStrip是.NET Framework提供的一种用于创建菜单栏的控件,它可以容纳多个...

    C#实现下载大文件.pdf

    ### C#实现下载大文件.pdf 的相关知识点 #### 核心概念与背景 - **ASP.NET**:一种用于构建动态Web应用程序的服务器端技术。它允许开发者使用C#等语言来编写网页逻辑,并且能够利用.NET框架的强大功能。 - **网络...

    C# findwindow及sendmessage外挂

    在IT行业中,编程语言C#提供了丰富的功能,其中包括与其它应用程序进行交互的能力。"C# findwindow及sendmessage外挂"这个主题就是关于如何利用C#的FindWindow和SendMessage这两个API函数来实现程序间的通信,尤其是...

    C#中使用XPath的方法(最精减)

    ### C# 中使用 XPath 的方法 #### XPath 介绍与应用场景 XPath 是一门功能非常强大的查询语言,用于在 XML 文档中查找信息。由于 XML 数据结构的复杂性,XPath 提供了一种灵活的方式来定位文档中的元素和属性。...

Global site tag (gtag.js) - Google Analytics