找回密码
 立即注册
快捷导航

[C#] C#最有价值的10个语法糖

[复制链接]
root 2023-6-12 22:11:10 | 显示全部楼层

C#语言是世界最优雅的语言之一,深受广大程序员的喜欢,尤其是其中的一些语法糖。C#语言推出了许多有价值的语法糖,这些语法糖可以使代码更加简洁、易读和提高程序的运行效率。下面将介绍10个比较实用的语法糖。

1、集合初始化器

集合初始化器允许我们在创建集合对象时使用简洁的语法来初始化集合的元素。C# 6引入了更简化的语法来初始化数组和集合,减少了冗余的代码。

List<string> names = new List<string> { "John", "Jane", "Alice" };
int[] numbers = { 1, 2, 3, 4, 5 };

2、空合并运算符

空合并运算符提供了一种简洁的方式来处理可能为null的值,它返回第一个非null的操作数。

string name = inputName ?? "Unknown";

3、条件访问运算符

条件访问运算符允许我们在访问对象的属性或调用方法之前,先检查对象是否为null。它可以减少空引用异常的发生。

string text = "abcdafdafadf";
int? length = text?.Length;

4、字符串插值

字符串插值使得在字符串中插入变量变得更加简单和直观,而不需要使用字符串连接操作符。

string name = "John";
int age = 30;
Console.WriteLine($"My name is {name} and I'm {age} years old.");

5、Lambda表达式

Lambda表达式提供了一种简洁的方式来定义匿名函数,使得代码更加简洁和可读。

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

6、异步和等待 (Async/Await)

异步和等待是C#中用于处理异步操作的关键字和模式。它们使得在执行耗时操作时,可以让程序保持响应,并在操作完成后继续执行相应的代码。

public async Task<string> GetDataAsync()
{
    HttpClient client = new HttpClient();
    string result = await client.GetStringAsync("https://api.example.com/data");
    return result;
}

7、引用传递和值传递简化

C# 7引入了ref locals和ref returns,使得在方法调用和赋值时可以更灵活地使用引用传递。

ref int GetReferenceToValue(ref int value)
{
    return ref value;
}

int x = 5;
ref int refX = ref GetReferenceToValue(ref x);
refX = 10; // 修改了原始变量x的值

8、分部方法

分部方法是一种特殊类型的方法,允许将方法的定义分割到多个部分中,其中一部分由开发者实现,另一部分由编译器生成。要求是必须声明在部分类里。

partial void LogMessage(string message);

// 编译器
partial void LogMessage(string message)
{
    // 代码逻辑
}

9、类型模式的 switch

C# 9引入了类型模式的 switch 表达式,使得在 switch 表达式中可以根据类型进行匹配和处理。

string result = obj switch
{
    string s => "它是string类型",
    int i => "他说int类型",
    _ => "未知类型"
};

10、扩展方法

扩展方法允许我们向现有的类型添加新的方法,而无需修改原始类型的定义,提高了代码的可扩展性。

public static class StringExtensions
{
    public static bool IsPalindrome(this string str)
    {
        // 判断字符串是否为回文
    }
}

string text = "level";
bool isPalindrome = text.IsPalindrome();

结语

以上是C#中最有价值的10个语法糖,它们提供了更强大、更灵活和更高效的编程工具,帮助开发者更轻松地编写清晰、简洁和可维护的代码。当然还有其它比较优秀的语法糖,比如并行Parallel.For,篇幅有限这里就不列出了。你觉得C#那个语法糖比较优秀,欢迎留言讨论。

https://mp.weixin.qq.com/s/M2h4PKRnvasfTU5Fbf5Hxg



回复

使用道具 举报

主题

0

回帖

170

积分

炉火纯青

 楼主| root 2023-6-12 22:29:21 | 显示全部楼层
本帖最后由 root 于 2023-6-12 22:34 编辑

C#9中比较有价值的3个新特征

C#每推出一个版本都有比较特别新特征,本文盘点在 C# 9 中比较有价值的3个新特征。

1、Records

Records是 C# 9 引入的一种新的引用类型,它简化了不可变数据类型的定义和使用。Records自动为属性生成相等性比较、哈希码计算和ToString()方法等常用方法,还支持结构化的模式匹配和解构赋值。Records使得处理不可变数据更加方便,可以减少样板代码,提高代码的可读性和可维护性。

示例代码:

public record Person(string UserName, int Age);
var person1 = new Person("赵云", 1000);
var person2 = new Person("赵云", 1000);
Console.WriteLine(person1 == person2);  // 输出: True
var updatedPerson = person1 with { UserName= "刘备" };
Console.WriteLine(updatedPerson.UserName);  // 输出: 刘备

2. 改进的模式匹配

C# 9 扩展了模式匹配功能,使得在代码中进行条件判断和类型匹配更加简洁和直观。新的模式匹配语法和模式匹配表达式提供了更灵活的匹配模式和模式组合,包括逻辑或(|)和逻辑与(&)操作符,以及递归模式等。改进的模式匹配使得处理复杂的条件逻辑变得更加简单和清晰。

//案例1
public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

//案例2 使用可选的括号来明确 and 的优先级高于 or
public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

//案例3  最常见的用途之一是用于 NULL 检查的新语法
if (e is not null)
{
    // ...
}

3. Init-only 属性

引入了init-only属性,它允许在对象创建后设置属性的初始值,并在之后禁止对其进行修改。这对于不可变对象和初始化过程中的属性验证非常有用。通过init关键字将属性标记为只能在对象初始化期间设置,可以提高代码的安全性和可读性,避免了不必要的属性修改。

public class Person
{
    public string UserName { get; init; }
    public string Age{ get; init; }
}

var person = new Person {UserName = "纪晓岚", Age= 200 };
// person.UserName= "和珅";  // 编译错误,属性只能在对象初始化期间设置
Console.WriteLine($"Full Name: {person.UserName } {person.Age}");

结语

这三个特征都有助于简化代码编写、提高开发效率,并提供更强大的模式匹配和数据处理能力。它们可以减少冗余的样板代码,改善代码的可读性和可维护性,同时也为开发人员提供更多的语言工具来处理复杂的数据结构和条件逻辑。


   
回复

使用道具 举报

主题

0

回帖

170

积分

炉火纯青

 楼主| root 2023-6-12 22:33:52 | 显示全部楼层

C#中检查null的语法糖,非常实用

c#处理null的几个语法糖,非常实用。(尤其是文末Dictionary那个案例,记得收藏)

??

如果左边是的null,那么返回右边的操作数,否则就返回左边的操作数,这个在给变量赋予默认值非常好用。

int? a = null;
int b = a ?? -1;
Console.WriteLine(b);  // output: -1

??=

当左边是null,那么就对左边的变量赋值成右边的

int? a = null;
a ??= -1;
Console.WriteLine(a);  // output: -1

?.

当左边是null,那么不执行后面的操作,直接返回空,否则就返回实际操作的值。

using System;
public class C {
    public static void Main() {
        string i = null;
        int? length = i?.Length;
        Console.WriteLine(length ?? -1); //output: -1
    }
}

?[]

索引器操作,和上面的操作类似

using System;
public class C {
    public static void Main() {
        string[] i = null;
        string result = i?[1];
        Console.WriteLine(result ?? "null"); // output:null
    }
}

注意,如果链式使用的过程中,只要前面运算中有一个是null,那么将直接返回null结果,不会继续计算。下面两个操作会有不同的结果。

using System;
public class C {
    public static void Main() {
        string[] i = null;
        Console.WriteLine(i?[1]?.Substring(0).Length); //不弹错误
        Console.WriteLine((i?[1]?.Substring(0)).Length) // System.NullReferenceException: Object reference not set to an instance of an object.
    }
}

一些操作

//参数给予默认值
if(x == null) x = "str";
//替换
x ??= "str";

//条件判断
string x;
if(i<3) 
    x = y;
else 
{  
    if(z != null) x = z; 
    else z = "notnull";
}
//替换
var x = i < 3 ? y : z ?? "notnull"

//防止对象为null的时候,依然执行代码
if(obj != null) 
    obj.Act();
//替换
obj?.Act();

//Dictionary取值与赋值
string result;
if(dict.ContainKey(key))
{
    if(dict[key] == null) result = "有结果为null";
    else result = dict[key];
}
else 
    result = "无结果为null";
//替换
var result= dict.TryGetValue(key, out var value) ? value ?? "有结果为null" : "无结果为null";

出处:https://www.cnblogs.com/dotnet-college/p/17067371.html

   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-23 01:25

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表