頂級(jí)語(yǔ)句
將類和類里面Main函數(shù)省略进泼,只留下核心的邏輯代碼就是頂級(jí)語(yǔ)句监憎!
1.頂級(jí)語(yǔ)句1
await System.Threading.Tasks.Task.Delay(1000);
System.Console.WriteLine("Hi!");
return 0;
static class $Program
{
static async Task<int> $Main(string[] args)
{
await System.Threading.Tasks.Task.Delay(1000);
System.Console.WriteLine("Hi!");
return 0;
}
}
1.頂級(jí)語(yǔ)句2
System.Console.WriteLine("Hi!");
return 2;
static class $Program
{
static int $Main(string[] args)
{
System.Console.WriteLine("Hi!");
return 2;
}
}
Init
struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
}
init通過(guò)允許調(diào)用方在構(gòu)造操作過(guò)程中改變成員渔期,訪問(wèn)器使不可變對(duì)象更具靈活性镊叁。 這意味著對(duì)象的不可變屬性可以參與對(duì)象初始值設(shè)定項(xiàng),因此不再需要類型中的所有構(gòu)造函數(shù)樣板团秽。 Point類型現(xiàn)在只是:
struct Point
{
public int X { get; init; }
public int Y { get; init; }
}
然后主胧,使用者可以使用對(duì)象初始值設(shè)定項(xiàng)來(lái)創(chuàng)建對(duì)象。
var p = new Point() { X = 42, Y = 13 };
記錄
記錄類型是引用類型习勤,類似于類聲明踪栋。 如果不包含,記錄將提供一個(gè)錯(cuò)誤 record_base argument_list record_declaration parameter_list 图毕。 部分記錄最多只能有一個(gè)分部類型聲明提供 parameter_list 夷都。
記錄參數(shù)不能 ref 使用 out 或 this 修飾符 (但 in params 允許) 。
繼承
除非類為 object 予颤,且類不能從記錄繼承囤官,否則記錄不能從類繼承冬阳。 記錄可以繼承自其他記錄。
public record Student(string name,int age) {
}
using System;
using System.Collections.Generic;
public class Student : IEquatable<Student>
{
#region 屬性這部分 可以看到set屬性沒(méi)有
#記錄具有不可變性党饮,記錄一旦初始化完成肝陪,那么它的屬性值將不可修改(可以通過(guò)反射修改)
public string Name { get; init; }
public int Age { get; init; }
#endregion
#region
protected virtual Type EqualityContract => typeof(Student);
#endregion
public override bool Equals(object? obj) => Equals(obj as R1);
public virtual bool Equals(Student? other)
{
return !(other is null) &&
EqualityContract == other.EqualityContract &&
EqualityComparer<string>.Default.Equals(this.Name, other.Name) &&
EqualityComparer<int>.Default.Equals(this.Age, other.Age);
}
public static bool operator ==(R1? left, R1? right)
=> (object)left == right || (left?.Equals(right) ?? false);
public static bool operator !=(R1? left, R1? right)
=> !(left == right);
public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.Append("Student");
builder.Append(" { ");
if (this.PrintMembers(builder))
{
builder.Append(" ");
}
builder.Append("}");
return builder.ToString();
}
}
支持解構(gòu)
public record Student(string Name, int Age) {
public string Name { get; set; }
public int Age { get; set; }
}
Student record = new Student("張三",19) ;
var (name, age) = record;
==》這個(gè)可以用在switch匹配上 還記得我們
string value = record switch{
("張三", 19) => "01",
("李四", 25) => "02",
_ => "default"
};
## 之所以可以用這個(gè)這么用 是因?yàn)榫幾g后多了這樣的解構(gòu)函數(shù)
public void Deconstruct(out string Name, out int Age) => (Name, Age) = (this.Name, this.Age);
with 表達(dá)式
with表達(dá)式是使用以下語(yǔ)法的新表達(dá)式。
Student record2 = record with { Name = "王五" };
//在編譯后等價(jià)于
var temp = record.<Clone>$();
temp.Name = "王五";
record2 = temp;
//不賦值 完全克隆
Student record3 = record with { };
好處:
1.比較兩個(gè)屬性是否相等跟屬性設(shè)置的順序無(wú)關(guān)
2.方便快速克隆刑顺,不影響原數(shù)據(jù)
3.補(bǔ)充了結(jié)構(gòu)體不支持繼承以及性能不高的短處
Lambda 棄元參數(shù)
允許丟棄 (用作 _ lambda 和匿名方法的參數(shù)) 氯窍。 例如:
- lambda: (_, _) => 0 , (int _, int _) => 0
- 匿名方法: delegate(int _, int _) { return 0; }
public delegate void FuncA(string a, string c);
static void Main(string[] args)
{
FuncA func = (_, _) => { };
}