Record
1、record類型是引用類型
2、爲什麼會新增這一類型?
1)面向對象編程中,比較兩對象是否相等,一般比較兩對象的內存地址是否一致。
2)然而在一些語境中,我們關注的是對象的字段/屬性是否相等。在這種情況下進行比較則需要將對象內的所有字段/屬性的值依次進行比較,若全部相等則表示兩對象相等,否則不相等。爲了簡化該語境下的比較,微軟新增了record類型,此時可以直接進行比較。
public class Cat{
public string NickName { get; set; }
public int Age { get; set; }
}
public record Dog{
public string NickName { get; set; }
public int Age { get; set; }
}
var cat1 = new Cat{ NickName="二愣子", Age=1 };
var cat2 = new Cat{ NickName="二愣子", Age=1 };
Console.WriteLine(cat1 != cat2);
var dog1 = new Dog{ NickName="二狗子", Age=2 };
var dog2 = new Dog{ NickName="二狗子", Age=2 };
Console.WriteLine(dog1 == dog2);
模式匹配
演變1:
int score = 99;
switch(score){
case 10:
Console.WriteLine("丟人了!!!");
break;
case 60:
Console.WriteLine("勉強合格!");
break;
case 99:
Console.WriteLine("上帝眷顧!");
break;
}
演變2:
int score = 99;
switch (score)
{
case 0:
Console.WriteLine("缺考?");
break;
case > 0 and <= 30:
Console.WriteLine("太爛了");
break;
case > 30 and < 60:
Console.WriteLine("還是不行");
break;
case >= 60 and < 80:
Console.WriteLine("還得努力");
break;
case >= 80 and < 90:
Console.WriteLine("秀兒,真優秀");
break;
case >= 90 and <= 100:
Console.WriteLine("不錯,奇蹟");
break;
}
演變3:
public class Order{
public float Qty {get; set;}
public string Name {get; set;}
}
Order od = new Order{ Qty = 1000f, Name = "黃金" };
switch(od){
case { Qty: > 1000f, Name:"黃金" }:
Console.WriteLine("真貴!!!");
break;
}
演變4:
public class Order{
public float Qty {get; set;}
public string Name {get; set;}
}
Order od = new Order{ Qty = 1000f, Name = "黃金" };
var res = od switch {
{ Qty: > 1000f, Name:"黃金" } => true,
_ => false
};
擴展用法:
object n = 5000000L;
if(n is long x)
{
Console.WriteLine("它是個長整型,存放的值是:{0}", x);
}
init
init 只用於只讀屬性的初始化階段,對於可讀可寫的屬性。
最初我們進行屬性初始化
public class Dog
{
public int No { get; } = 0;
public string Name { get; } = "no name";
public int Age { get; } = 1;
public Dog(int no, string name, int age)
{
No = no;
Name = name;
Age = age;
}
}
=> Dog dog = new(1001, "亞亞", 4);
現在
public class Cat
{
public int No { get; init; }
public string Name { get; init; }
public int Age { get; init; }
}
=> Cat cat = new Cat { No = 100, Name = "丫丫", Age = 4 };
只讀屬性初始化結束後不可賦值,故 dog.No = 1; 或 cat.No = 1;都會報錯。