02.C#可空類型、默認參數、LINQ(一章1.3-1.4)

  利用上班時間發個隨筆,不知領導會不會看到,可能會有同事看到也說不定啊:)

  

  關于可空類型,在C#1中沒有這個概念,在C#3中引入的。那比如我們要實現一個表示人的類,人有名字和年齡兩個屬性,如何表示一個沒有年齡的人呢?

一般作法會將一人int類型封裝成一個引用類型,有人的類中使用成員屬性,該屬性的類型為剛封裝的引用類型,如下

 public class Person
{
private string name;
private PersonAge age; public Person(string name, PersonAge age)
{
this.name = name;
this.age = age;
} } //C#1中使用一個一個引用包裝器類 public class PersonAge
{
public int Age;
public bool HasAge;
}

  那要判斷是否有年齡,如Person有一個實例p,則要判斷p對象中的私有屬性age的HasAge是否為true,true表示有年齡,反之沒有。這樣做顯然會引入大量不需要的類,且這些類中有功能重復的、表示一個標示的bool類型的屬性。在C#3中引入可空類型,實現方式為新增了一個NullAble<T>的結構,相信實現應該和我們的PersonAge一樣,只是現在這個系統默認支持的,何不樂乎~

  

 public class Person1
{
private string name;
private int? age; public Person1(string name, int? age)
{
this.name = name;
this.age = age;
}
}

  結合C#4中提供的可選參數和默認參數,則可以使用null來初始化age這個值,當需要判斷人是否有年齡,只需判斷p的私有屬性age是否為null即可。

 public class Person2
{
private string? name;
private int? age; public string? Name { get { return name; } set { name = value; } }
public int? Age { get { return age; } set { age = value; } } public Person2(string? name, int? age = null)
{
this.name = name;
this.age = age;
}
}

  在入口類中去判斷

 Person2 p2 = new Person2(null, null);

             //可以使用"?"用null來賦值,來判斷是否有名字和年齡

             if (p2.Age == null)
{
Console.WriteLine("這個人沒有年齡!!!");
} if (p2.Name == null)
{
Console.WriteLine("這個人沒有名字!!!");
}

  總結下,其實只要記住在非引用類型后加一個"?",則可以使用null來賦值。如int? a=null、short? b=null ...

  

  下面來說下LINQ(語言集成查詢),重新寫一個Book類,如下

 public class Book
{
public string Author { get; set; }
public int PageSize { get; set; } public Book(string author, int pageSize)
{
Author = author;
PageSize = pageSize;
} public static List<Book> GetBooks()
{
return new List<Book> {
new Book("fish0",),
new Book("fish1",),
new Book("fish2",),
new Book("fish3",),
new Book("fish4",),
new Book("fish5",)
};
}
}

  入口頁面使用如下

 class Program
{
static void Main(string[] args)
{ List<Book> list = Book.GetBooks();
//選擇書的頁數大于1000的書并打印 var matching = from Book b in list
where b.PageSize >
select b;
foreach (var m in matching)
{
Console.WriteLine(m.Author + " " + m.PageSize);
} Console.ReadKey();
}
}

  常常和LINQ一起使用的關鍵字,我覺得是var,因為想讓編譯器判斷是什么類型,這個就是隱式類型,省去一些繁雜的類型輸入。LINQ的語法和SQL幾乎相同,學習的成本會很小,SQL中的join、order by、group by等都可以在C# LINQ中找到對應的法。

  在使用EF等其它ORM框架時,使用LINQ能大大減少代碼量,而且很多的查詢操作都是延時查詢,并不是一次性取出所有的數據,再從中進行篩選,而是通過LINQ生成SQL語句,然后到數據庫中查詢。

  請斧正。

上一篇:Docker Dockerfile详解


下一篇:Python环境搭建和开发工具的配置