一、接口(interface)
1. 接口是一个引用类型,通过接口可以实现多重继承。
2. C#中接口的成员不能有new、public、protected、internal、private等修饰符。
3. 接口中只能声明"抽象"成员(所以不能直接下一步对接口进行实例化(即不能使用new操作符声明一个接口的实例对象)),而不能声明共有的域或者私有的成员变量。
4. 接口声明不包括数据成员,只能包含方法、属性、事件、索引等成员。
5. 接口名称一般都以“I”作为首字母(当然不这样声明也可以),这也是接口和类的一个区别之一。
6. 接口成员的访问级别是默认的(默认为public),所以在声明时不能再为接口成员指定任何访问修饰符,否则编译器会报错。
7. 接口成员不能有static、abstract、override、virtual修饰符,使用new修饰符不会报错,但会给出警告说不需要关键字new。
8. 在声明接口成员的时候,不准为接口成员编写具体的可执行代码,也就是说,只要在对接口进行声明时指明接口的成员名称和参数就可以了。
9. 接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类(通过具体的可执行代码实现接口抽象成员的操作)。
10.接口包含的成员只有方法,属性,索引器(有参属性),事件四种成员。方法的实现是在实现接口的类中完成的。
11.接口可以是命名空间或类的成员,并且可以包含下列成员的签名:

      ·方法  ·属性  ·索引器 ·事件 

12.一个接口可从一个或多个基接口继承。
13.当基类型列表包含基类和接口时,基类必须是列表中的第一项。
14.实现接口的类可以显式实现该接口的成员。显式实现的成员不能通过类实例访问,而只能通过接口实例访问。
 
二、类(class)
1.类的概念

    类是对象概念在面向对象编程语言中的反映,是相同对象的集合。类描述了一系列在概念上有相同含义的对象,并为这些对象统一定义了编程语言上的属性和方法。

2.类的声明

    C#中,类是使用class关键字来声明的,语法如下。  

    类修饰符 class 类名  {  }  

    例如:  public class Car  {      public int number; //编号   

            public string color; //颜色   

            private string brand; //厂家  }  

3.构造函数和析构函数

       构造函数和析构函数是类中比较特殊的两种成员函数,主要用来对对象进行初始化和回收对象资源。一般来说,对象的生命周期从构造函数开始,以析构函数结束。如果一个类含有构造函数,在实例化该类的对象时就会调用,如果含有析构函数,则会在销毁对象时调用。构造函数的名字和类名相同,析构函数和构造函数的名字相同,但析构函数要在名字前加一个波浪号(~)。当退出含有该对象的成员时,析构函数将自动释放这个对象所占用的内存空间。    

    (1)构造函数:构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。    

    (2)析构函数:析构函数是以类名加~来命名的。.NET Framework类库有垃圾回收功能,当某个类的实例被认为是不再有效,并符合析构条件时,.NET Framework类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收。

4.对象的声明和实例化

    对象是具有数据、行为和标识的编程结构,它是面向对象应用程序的一个组成部分,这个组成部分封装了部分应用程序,这部分程序可以是一个过程、一些数据或一些更抽象的实体。 对象包含变量成员和方法类型,它所包含的变量组成了存储在对象中的数据,而其包含的方法可以访问对象的变量。略为复杂的对象可能不包含任何数据,而只包含方法,并使用方法表示一个过程。 C#中的对象是把类实例化,这表示创建类的一个实例,“类的实例”和对象表示相同的含义,但需要注意的是,“类”和“对象”是完全不同的概念。  

5.类与对象的关系

    类是一种抽象的数据类型,但是其抽象的程度可能不同,而对象就是一个类的实例。类是具有相同或相似结构、操作和约束规则的对象组成的集合,而对象是某一类的具体化实例,每一个类都是具有某些共同特征的对象的抽象。

 

三、结构体(struct)

1.声明结构的语法 - struct关键字

      public struct AddressBook

       {

         //字段、属性、方法、事件

       }

    对于类而言,两个变量指向同一个对象的情况是存在的,因此对这样两个变量中的任意一个进行操作,起结果必然会影响另外一个,因为它们指向的是同一个对象。

    结构是值类型,直接包含它自己的数据,每个结构都保存自己的一份数据,修改每一个结构的数据都不会对其他结构的数据造成影响。

2.给结构赋值

    如果从结构中创建一个对象,并将该对象赋给某个变量,则该变量包含结构的全部值。复制类型为结构的变量时,将同时复制该结构所持有的所有数据。由于结构不是引用类型,因此结构类型的变量不能被赋予null值。

    将一个结构变量赋值给另一个结构变量,就是把数据从一个结构复制到另一个结构。而类则不同,在类的变量之间,复制的是引用,而不是类数据。因此当数据比较大的时候,这种数据复制机制会带来较大的开销。

3.构造函数

    结构类型可以有实例构造函数和静态构造函数,但不能有析构函数。

   (1)实例构造函数

结构类型都有一个预定义的,没有参数的构造函数,这点与类是一样的。

    注意如果没有使用new运算符,是不可以使用数据成员的值(除非已显示地设置了该数据成员的值)和调用函数成员的(除非所有数据成员均已经被赋值)。

 (2)静态构造函数

    和类一样,结构类型也可以有静态构造函数,静态构造函数用于初始化静态数据成员。静态构造函数有如下特点:

     1、静态构造函数不能有访问修饰符和参数;

     2、静态构造函数不能访问实例成员;

     3、静态构造函数无法直接进行调用;

结构和类的静态构造函数的触发规则不同,类的静态构造函数是在创建第一个实例或引用任何静态成员之前自动调用的,而结构的静态构造函数在以下情况调用:

    1、使用显式声明的构造函数进行初始化。

    2、调用结构的方法或访问结构的静态数据成员(无论是读取还是赋值,访问实例数据成员不会触发CLR自动调用静态的构造函数)。

4.结构的多态和可继承性

    结构直接派生自System.ValueType,间接派生自System.Object,但结构是隐式密封的,不能作为基类在派生出其他的结构,也不能从类派生,但可以从接口派生。

  结构的特性:

     1、结构类型总是隐式密封的,因此在定义结构时不能使用sealed和abstract关键字;

     2、因为结构不能作为基类,结构的成员不能使用如下访问修饰符:protected和protected,internal;

     3、结构的函数成员不能声明为abstract和virtual,但是可以使用override关键字,用以覆写它的基类System.ValueType中的方法。

5.结构的装箱与拆箱

    结构是值类型,因此当它被转换为object类型时,或者它所实现的接口类型的时候,就会执行装箱操作;同样,当执行相反操作的时候,就会执行

拆箱操作。

7.结构和类的对比

          结构                    类
  数据类型                值类型                引用类型
  是否必须使用new运算符实例化       否                     是
  是否可声明无参数的构造函数       否                     是
  数据成员可否在声明的同时初始化     声明为const或static可以,数据成员不可以  可以
  直接派生自什么类型           System.ValueType               有   

       是否有析构函数             无                                                                 有
  可否从类派生              否                    可以
  可否实现接口              可以                   可以
  实例化时在栈还是在堆分配内存      栈                堆,栈中保存引用
  该类型的变量可否被赋值为null        否                    可以
  可否定义私有的无参构造函数       否                    可以
  是否总有一个默认的无参构造函数       是                      否

       无论结构使用预定义的、无参数的构造函数,还是使用用户定义的、有参数的构造函数进行初始化,都会初始化结构的数据成员。不过预定义的,无参的会将数值型初始化为默认值,引用类型初始化为null;而用户自定义的初始化策略对个成员进行初始化。因此结构类型的数据成员不允许在声明是显式初始化。

8.性能

       因为结构是值类型,因此在为结构分配内存,或者当结构超出了作用域被删除时,性能会非常好,因为他们将内联或者保存在堆栈中。当把一个结构类型的变量赋值给另一个结构时,对性能的影响取决于结构的大小,如果结构的数据成员非常多而且复杂,就会造成损失,接下来使用一段代码来说明这个问题。

      结构和类的适用场合分析:

    1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些。

    2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低。

    3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。

    4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。

 

四、属性(property)

1.属性是一种类的成员,它的实现类似函数,访问类似字段。它的作用是提供一种灵活和安全的机制来访问,修改私有字段。所以属性必须依赖于字段
2.没有set的属性是一种只读属性,没有get的访问器是一种只写属性。
   (1) get访问器用来返回字段或者计算 并返回字段,它必须以return或者throw终结。
   (2) set访问器类似返回类型为void的函数,使用value的隐式参数
   (3) 访问器的限制

       属性访问标记可以为public,private,protected,internal,protected internal,因为访问器的访问限制必须比属性的访问限制更加严格,所以能对接口或者显式的接口使用访问器的访问限制必须比属性的访问限制更加严格,所以能对接口或者显式的接口使用访问修饰符,因为接口里里面所有的默认是public的;
同时具有get,set访问器时,才允许使用访问修饰符,并且只能有一个使用;
如果属性有override修饰的时候,访问器修饰符必须与被重写的匹配。
访问器的可访问级别必须比属性的可访问级别更加严格

  (4)可以static 修饰属性,以便随时访问
  (5)属性隐藏
  (6)virtual来修饰属性,派生类使用override来重写属性
  (7)abstract 修饰属性,派生类来实现属性
  (8)sealed 修饰属性,派生类不能修改属性
  (9)接口属性
           接口属性不具有函数体
  (10) 自动属性
         当属性访问器中不需要其他访问逻辑时候,就可以使用自动属性,使代码更加简洁。
 
五、委托(delegate)
1.委托的基本概念

      委托是面向对象编程的基本思想之一,就是将具有共同特征的某一类具体对象抽象为类。

2. 委托类型的定义

       委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

       delegate void MyDel(int x);

   委托类型声明:

   (1) 以deleagate关键字开头。

   (2)返回类型+委托类型名+参数列表。

3. 声明委托变量
4. 初始化委托变量

    (1) 使用new运算符

   new运算符的操作数的组成如下:

   委托类型名

    一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以实例方法或静态方法。

   (2)使用快捷语法

   快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称

和其相应的委托类型之间有隐式转换。

5. 赋值委托

    由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

6. 组合委托

    委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

7. 委托加减运算

   可以使用+=运算符,为委托新增方法。

   同样可以使用-=运算符,为委托移除方法。

8. 委托调用

    委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

    在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

9. 匿名方法

    匿名方法是在初始化委托时内联声明的方法。

    基本结构:

    deleage( 参数 ) { 语句块 }

10. Lambda表达式

     Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

    删除delegate关键字

    在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。

 

六、事件(event)

1.事件定义

    C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:public delegate void MyEventHandler

    (object sender, MyEventArgs e);
    其中的两个参数,sender代表事件发送者,e是事件参数类。      MyEventArgs类用来包含与事件相关的数据,所有的事件参数

    类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。

2、创建步骤

    (1)、定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。

    (2)、定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
 (3)、定义"事件处理方法,它应当与delegate对象具有相同的参数和返回值类型"。
 (4)、用event关键字定义事件对象,它同时也是一个delegate对象。
 (5)、用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
 (6)、在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
 (7)、在适当的地方调用事件触发方法触发事件。

 

七:搭建 SVN 服务器,使用 SVN 客户端进行源代码管理

(一):SVN服务器搭建和使用。
    首先下载和搭建SVN服务器,下载地址如下: http://subversion.apache.org/packages.html
    1、下载VisualSVN server 服务端并安装
    2、建立用户和组,并且需要分配权限。
(二):客户端SVN安装。
   1、下载 ”svn小乌龟”后,进行安装
   2、checkout项目文件。
   3、TortoiseSVN Client基础操作:
   (1) SVN检出(SVN Checkout)
   (2) 增加(Add)
   (3) 删除(Delete)
   (4) 改名(Rename)
   (5) SVN还原(SVN Revert)
   (6) 检查更新(Check for modifications)
   (7) SVN更新(SVN Update)
 
八、开通博客园
 1、进入博客园:https://www.cnblogs.com/ 
 2、注册并登录博客账号
 
 
九:开发环境搭建 vs2017,数据库:MSSQL SERVER 2008 R2
 2、安装数据库:MSSQL SERVER 2008 R2
 

十、参考文献

[1]张娜,魏新红.C#可视化编程技术.北京:清华大学出版社,2015.
[2]闫洪亮,等.ASP.NET4.0程序设计教程.哈尔滨:哈尔滨工程大学出版社,2014.
[3]编码风格参考: https://github.com/starts2000/TaoShang 
[4]博客园:https://www.cnblogs.com/ 
[5]微软开源项目:https://github.com/Azure/DotNetty

 

 
 

 

 
 

 

 
posted on 2017-08-02 09:57  最好的我们(liaory)  阅读(1310)  评论(0)    收藏  举报