点击关注公众号,Java干货及时送达
粉丝福利:小编会从今天留言的小伙伴中随机抽赠送8.88元现金红包。娱乐抽奖,大家随缘积极参与啦,给生活一点小幸运~感谢大家的支持
文 | 罗奇奇
出品 | OSC开源社区(ID:oschina2013)
C# 11 预览:允许在内插字符串的“插值表达式”中换行
$""
和 $@""
)两种。两者最大的区别是:非逐字内插字符串与普通字符串一样,不能在字符串文本中包含换行符,必须使用转义符(如\r
、\n
)。相反,逐字插值字符串可以在其文本段中包含换行符,并且不会转义换行符或其他字符。var v = $"Count is\t: { this.Is.A.Really()
.That.I.Should(
be + able)[
to.Wrap()] }.";
C# 11 预览:列表模式
..
。切片模式后面可以跟着另一个列表模式,比如 var 模式来捕获切片内容。[1, 2, .., 10]
:int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };
public static int CheckSwitch(int[] values)
=> values switch
{
[1, 2, .., 10] => 1,
[1, 2] => 2,
[1, _] => 3,
[1, ..] => 4,
[..] => 50
};
WriteLine(CheckSwitch(new[] { 1, 2, 10 })); // prints 1
WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // prints 1
WriteLine(CheckSwitch(new[] { 1, 2 })); // prints 2
WriteLine(CheckSwitch(new[] { 1, 3 })); // prints 3
WriteLine(CheckSwitch(new[] { 1, 3, 5 })); // prints 4
WriteLine(CheckSwitch(new[] { 2, 5, 6, 7 })); // prints 50
public static string CaptureSlice(int[] values)
=> values switch
{
[1, .. var middle, _] => $"Middle {String.Join(", ", middle)}",
[.. var all] => $"All {String.Join(", ", all)}"
};
列表模式适用于任何可计数和可索引的类型 —— 这意味着它有一个可访问的
Length
或Count
属性,以及一个带int
或System.Index
形参的索引器。切片模式适用于任何可计数和可切片的类型 —— 这意味着它有一个以
Range
为实参的可访问索引器,或者具有两个int
形参的可访问Slice
方法。目前正在考虑在 IEnumerable 类型上添加对列表模式的支持,点此查看(https://github.com/dotnet/csharplang/blob/main/proposals/list-patterns.md)关于该列表模式的详细介绍。
C# 11 预览:新的参数空值检查
null
,以及正确抛出 ArgumentNullException
。public static void M(string s)
{
if (s is null)
{
throw new ArgumentNullException(nameof(s));
}
// Body of the method
}
!!
到参数名,自动执行空值检查:public static void M(string s!!)
{
// Body of the method
}
base
构造函数和调用 this
构造函数之前。如何尝试预览特性
csproj
文件配置如下:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>