C# IN Depth读书笔记1

话说我又开始读新书了,最近本来想把F#学学,刚学了个hello world,却发现自己有点托大了,自身的C#都没精,跑去学F#,想想还是先把C#学好吧,当然嘛F#作为一门FP,对于开拓眼界还是相当有裨益的,我的这个F#学习系列我也会尽量完成。不过首先我还是希望能够先把C#学好,然后再谈其他的。

另外LINQ的那个笔记目前也是太监一个,我甚至我怀疑我是不是这个序列也是一个太监,会不会看2天也会不动了,CLR Via C#那个笔记同样也是太监,不过当初看这本书的时候是咱刚接触.NET的时候,相对那个时候的确有点显深,现在读的话还是比较合适吧。所以我的目标是现在先读完这本C# IN depth,然后细读一遍CLR Via C#,我相信我应该能够完成吧,所以现在就开始吧。

最开始看到这本书实在老赵的博客上,有推荐过这本书,后来网上一搜还真发现有电子书,哈哈~而且我也没有完整的读过一本C#3.0的书,虽然是英文书,我觉得我还是能啃的。

本文的序,前言简单的介绍了C#1.0到C#3.0的演变,以及本书的使用者-的确本书是不适合初学者的,前言也有介绍过本书的使用者至少能够对1.0有较好的了解,或者接触过2.0或者3.0的东西…七零八落的说了不少….好吧,让我们正式开始吧~

第一章

C#的发展

时间在前进,世界在发展,这在计算机的世界里体现的尤为明显,无论是软件上的还是硬件上的。C#就是一门不断演变的语言。嗯,说起变化,这的确一把双刃剑,有的人说:啊,我.net2.0都不咋会3.0怎么又出来了呢,我又不想去学3.0,出来干嘛啊。另外一方面,新的语言特性会让你很爽,你将会改变你的编码风格,你将会发现3.0更有表现力更有生产力~

1.1进化的演变

下面将会有几个小例子让我们看到风格的演变:

C#1.0

public class Product
{
string name;
public string Name
{
get { return name; }
}

decimal price;
public decimal Price
{
get { return price; }
}

public Product(string name, decimal price)
{
this.name = name;
this.price = price;
}

public static ArrayList GetSampleProducts()
{
ArrayList list
= new ArrayList();
list.Add(
new Product("Company", 9.99m));
list.Add(
new Product("Assassins", 14.99m));
list.Add(
new Product("Frogs", 13.99m));
list.Add(
new Product("Sweeney Todd", 10.99m));
return list;
}

public override string ToString()
{
return string.Format("{0}: {1}", name, price);
}
}

很简单,一个类,一个构造函数,2个fields,2个属性,一个ArrayList类型的方法,一个重写的ToString()方法。有几点值得注意:

1.  ArrayList在编译期间没有任何信息,就是不知道它里面有些啥。

2.  我们提供了一个Public的getter,也就是说,如果我们再想要一个setter,他也必须是Public的。在这种情况下使用一个字段是没有什么问题的,但是当我们要进行验证的时候就会有问题啦。(这个地方没怎么看明白)我们很自然的会想到给属性搞一个setter,但是我们又不想将他暴露在外面。所以必须搞一个类似Private的method,但是在这里一个Public,一个Private显得挺不协调的。

3.  还是那么个意思,字段应该私有化,通过属性访问。

4.  这段代码挺失败,把问题搞复杂化了(是吗,我怎么没看出来……)

再来看看C#2.0

public class Product
{
string name;
public string Name
{
get { return name; }
private set { name = value; }
}

decimal price;
public decimal Price
{
get { return price; }
private set { price = value; }
}

public Product(string name, decimal price)
{
Name
= name;
Price
= price;
}

public static List<Product> GetSampleProducts()
{
List
<Product> list = new List<Product>();
list.Add(
new Product("Company", 9.99m));
list.Add(
new Product("Assassins", 14.99m));
list.Add(
new Product("Frogs", 13.99m));
list.Add(
new Product("Sweeney Todd", 10.99m));
return list;
}

public override string ToString()
{
return string.Format("{0}: {1}", name, price);
}
}

与1.0相比没有太大的变化,不过有2个最明显的地方。第一是我们有了Private setter,第二是我们有了List的泛型,也就是编译期就能确定List中存的是Product类的东西,很好,我们解决了上述问题中的2个。

C#3.0(自动完成属性与简单初始化)

class Product
{
public string Name { get; private set; }
public decimal Price { get; private set; }

public Product(string name, decimal price)
{
Name
= name;
Price
= price;
}

Product()
{
}

public static List<Product> GetSampleProducts()
{
return new List<Product>
{
new Product { Name="Company", Price = 9.99m },
new Product { Name="Assassins", Price=14.99m },
new Product { Name="Frogs", Price=13.99m },
new Product { Name="Sweeney Todd", Price=10.99m}
};
}

public override string ToString()
{
return string.Format("{0}: {1}", Name, Price);
}
}

嗯哼,有些变化吧,首先是属性的getter与setter的变化,其次是集合初始化的变化方式。

让我们来总结下变化吧~

从C#1.0的只读属性和弱类型集合到C#2.0的私有属性"setters"以及强类型泛型集合再到C#3.0的自动完成属性以及进一步加强的集合初始化,这的确是一个很明显而且很重要的演变过程。

事实上,泛型(generics)是C#2.0中最重要的东西,这在以后的文章中会有所体现。

posted @ 2010-03-24 21:18  Tmac_  阅读(219)  评论(0)    收藏  举报