.NET菜鸟试飞日记(一)
一个写了三年C的程序员转过来搞OO,写.net,其中的不适应还真是不少,想要写这样一系列博文的目的也并非是想要出书立传,而在于能给同我一样的.net新手一些弯路的提示
望高手不必来拍砖~^_^
//***************************************************************************************************************************
第一节 由WEB开发而走进.net
因为个人需要,工作之余需要写一个B2C的平台,因而需要学习一门能够迅速搭建起web应用的语言或者平台,于是便开始了我的.net之旅。因本人目的为构建web应用,因此,便从web应用开始写起。
我想几乎任何一个新人或者从其他领域转向web应用的人,都会很困惑,首先是对web应用程序下那一大堆的各式文件感到眼花缭乱,所以我觉得初接触一个新的平台,最先需要做的不是学习语言也并非了解平台结构,而是去了解这个平台构建应用程序的基本目录结构
从上图可以看出一个web应用项目主要由几大部分组成:
1. App_Code 顾名思义,是业务代码部分
2. App_Themes 不难看出,这里是网站的样式文件部分,*.skin/*.css
3. Bin 这里开始我也很费解,不过后来看了几个网站源代码以后就明白了,这里是用来引用DLL文件的
4.Comn_Images 这里是放网站图片的,不过是主页的一些元素图片,和网站存储的数据图片无关
5.Controls 看名字就知道是控件部分,所有使用的控件文件都在这里
6. Prod_Images 这里是存放网站存储的item的图片,其实这里和文件夹4合并起来觉得也没有什么问题,只不过这样做增加条理性吧
7. Global.asax global.asax:是对 asp文件中global.asa的代替,它可以使我们执行asp.net应用程序一层事件的代码,如:application_start等,使你可以在这些事件中作一些自定义的处 理;也可以定义应用程序一层的变量,如:Session等,这在整个asp.net应用程序中起作用。
8. web.config 如果写过java的同学也许不难想起web.xml和struts-config.xml,我个人觉得.net的web.config就好像web.xml+struts-config.xml,可以对应用程序作一些安全性的配 置,也可以对全局程序集的属性进行设置,譬如字符集的设置,譬如数据库连接字符串的定义等都可以在这里完成,具体的可以在msdn中查到
9. XXXX.aspx 这就是整个应用程序中最光鲜的部分,页面文件了 ,页面文件下有对应的XXXX.aspx.cs是主要对页面数据更新处理事件相应等等都放在这里,可以说是操纵aspx的傀儡师
基本的目录结构了解完毕的话,就可以开始写第一个web应用程序了,个人觉得虽然说学习需要循序渐进,可是从开始就选择高起点未必是一件坏事,所以我选择了petshop 4.0作为学习的对象,虽然现在已经是5.0了,不过因为3.5新出了WCF,作为初学者,很多不知道的东西再加上WCF,估计会很够呛,所以找个理由让自己偷个小懒吧,先从4.0开始。
那么从开始以前,需要快速浏览一下C#的基本语法,当然如果使用C++或者VB都可以作为后台代码语言,选自己喜欢的就可以,我选了C#,因为没有接触过,尝个新鲜(虽然出来很久了,但是一直没有尝试过,BS下自己!)
第二节 C#语言基础
1. 类型
了解一种编程语言,了解类型是要第一步做好的事情,就好像使用新产品前需要读注意事项。那么随便找到一本C#书籍或者在MSDN上查阅都可以很轻易的找到相关信息,这里就不再重复了,不过需要介绍一下其中的object类型,因为有关C#的装箱和拆箱
int i = 123;
object o = (object)i; // boxing
o = 123;
i = (int)o; // unboxing
装箱和取消装箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到
2. OO基础
既然是使用完全构建在OOD之上的一门语言,那么对OOD烂熟于心是必修课之一。什么是OO,OO是面向对象 ,这个词汇一点都不陌生,C++中也有OO,说到OO,很多同学自然想到继承 接口 多态等等一系列东西。那么C#的00和C++的OO又有什么区别呢,C#是只允许单一继承的,也就是说,C#程序里所有的类必须都是从一个基类继承而来,却可以实现多个接口。
(1)派生类和抽象类
// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
从以上例子可以看出来,抽象类不能实例化,但是却可以被派生,使用派生类来重写抽象类继承而来的虚方法 ,而派生类也必须这么做。
(2)多态性
在C#使用OO的多态,需要掌握的是New 和 Override关键字,以下是例子
// Define the base class
class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine("Four wheels and an engine.");
}
}
// Define the derived classes
class ConvertibleCar : Car
{
public new virtual void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("A roof that opens up.");
}
}
class Minivan : Car
{
public override void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("Carries seven people.");
}
}
以下是测试代码
public static void TestCars1()
{
Car car1 = new Car();
car1.DescribeCar();
System.Console.WriteLine("----------");
ConvertibleCar car2 = new ConvertibleCar();
car2.DescribeCar();
System.Console.WriteLine("----------");
Minivan car3 = new Minivan();
car3.DescribeCar();
System.Console.WriteLine("----------");
}
以下是输出:
Four wheels and an engine.
----------
Four wheels and an engine.
A roof that opens up.
----------
Four wheels and an engine.
Carries seven people.
----------
那么通过以上我们了解到当派生类需要一个成员来重写基类的虚方法的时候,需要用new操作符或者override操作符来声明该虚方法被重写
使用base指针来调用基类方法。
(3)接口的实现
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
3. 代理(delegate)
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
4. 泛型
泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用与集合以及作用于集合的方法一起使用。.NET Framework
2.0 版类库提供一个新的命名空间
5.LINQ TO SQL
在 LINQ to DataSet 中,它是一个 IEnumerable<
这个最近比较热门的东西不得不提
IEnumerable<string> highScoresQuery2 =
from score in scores
where score > 80
orderby score descending
select String.Format("The score is {0}", score);
具体还没用过,不知道LINQ TO SQL这个用LINQ语言实现的ORM到底如何,不作评价。
先告一段落,年纪大了,熬不动了,明天继续了~好困