c# 高级编程第四版文摘

第一章  .net体系结构

Microsoft中间语言 简称 IL

通用类型系统 Common Type System   CTS

公共语言规范 Common Language Specification CLS

公共语言运行库 CLR  运行库的执行环境

 

托管代码 managed code

在CLR的控制下运行的代码

 

在.net中编译分为两个阶段:

1.把源代码编译为IL

2.CLR把IL编译为平台专用的代码

 

托管代码的优点:

1.平台无关性

2.提高性能

  IL总是即时编译的 JIT编译 编译它调用的那部分代码,得到的内部可执行代码就存储起来,在下次运行这部分的代码时,就不需要重新编译了.

3. 语言的互操作性

  能将任何一种语言编译为中间代码

 

IL的主要特征:

1.面向对象和使用接口

   传统的面向对象的编程,带有类的单一继承性

2.值类型和引用类型有巨大差别

   值类型,变量直接保存其数据,引用类型,变量仅保存地址,对应的数据可以在该地址中找到

   值类型一般存储在堆栈中,引用类型的实例总是存储在一个名为托管堆的内存区域中。

3.强数据类型

  所有的变量都清晰地标记为属于某个特定数据类型

  优点:

  (1)语言的互操作性

      如何解决?

      1.CTS 定义了可以在中间语言中使用的预定义数据类型,还定义了一个内容丰富的类型层次结构。CTS的层次结构反映了中间语言的单一继承的面向对象的方法.

      2.CLS

  (2)垃圾收集

      处理目前代码中的所有变量,检查对存储在托管堆上的对象的引用,没有引用的对象就删除

  (3)安全性

  (4)应用程序域

      用于减少运行应用程序的系统开销

      方法是把任何一个进程分解到多个应用程序域中,每个应用程序域大致对应一个应用程序,执行的每个线程都运行在一个具体的应用程序域中.

  (5)通过异常方法处理错误

  (6)特性的使用

 

程序集

assembly 是包含编译好的,面向.net Framework的代码的逻辑单元.

两种类型:

共享程序集和私有程序集

 

反射

可以编程访问在程序集中定义的所有类型和这些类型的成员的细节.

 

asp的缺点:

1.页面显示比较慢

2.asp文件难维护

3.开发难

 

asp.net的优点:

1.页面结构化

2.使用vs2005

3.后台编码功能允许进一步采用结构化的方式

4.提高性能

5.易于编写


第二章  c#基础

数据类型

 

值类型

1.整型

有符号       sbyte short  int long   无符号    byte  ushort  uint  ulong

                   8       16    32  64                    8         16      32     64

2.浮点类型

float    32  单精度    double  64  双精度

3.decimal 类型

128位高精度十进制数

4.bool 类型

5.字符类型    16位

 

引用类型

1.object 类型

2. string 类型

 

引用举例:

 

1.  Vector x,y                                        

     x=new Vector();

     x.Value=30;

     y=x;

     Console.WriteLine(y.Value);

     y.Value = 50;

     Console.WriteLine(x.Value);

输出: 30  50   x和y 引用同一个对象

 

2.   string  s1="a";

      string  s2=s1;

      Console.WriteLine(s1);

      Console.WriteLine(s2);   

      s1="b";

      Console.WriteLine(s1);

      Console.WriteLine(s2);     

输出:a,a,b,a   s1的引用变了,s2的引用没变

 

switch()

{

    case 1:

       //

    break;

 

    case 2:

       //

    break;

   

    default:

      //

    break;

}    

 

 

c#编程规则:

Pascal大小写规则:

名称 MaximumLength

camel大小写规则:

subscriberId

类型中所有私有成员字段的名称

传递给方法的所有参数

区分同名的两个对象

                      

 第三章 对象和类型

类和结构

 

类成员

1.数据成员 字段,常量,事件

2.函数成员

   (1)方法

   (2)属性

   (3)构造函数

   (4)终结器

   (5)运算符

   (6)索引器

 

结构和类的区别:

1.结构是值类型,存储在堆栈(stack)上,类是引用类型,存储在托管堆(heap)上

2.结构不支持继承

3.结构的构造函数提供一个无参数的默认构造函数,这是不允许替换的

 

部分类

 

静态类

 

object类

 第四章 继承

继承类型:

1.实现继承

表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数

2.接口类型

表示一个类型只继承了函数的签名,没有继承任何实现代码

 

结构并不支持实现继承,但支持接口继承

 

结构总是派生于System.ValueType,它们还可以派生于任意多个接口

类总是派生于用户选择的另一个类,它们还可以派生于任意多个接口

 

隐藏方法

如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为Virtual和Override,派生类方法就会隐藏基类方法

在C#中,使用new关键字声明我们要隐藏一个方法

 

密封类和密封方法

sealed 类不能被继承,方法不能重写

 

修饰符:

public

protected  派生类访问

internal  包含的程序集

new   成员用相同的签名隐藏继承的成员

virtual  派生类重写

sealed   override 一起使用

extern   仅静态[DllImport]方法

 

接口

 

不允许提供接口中任何成员的执行方式,接口只能包含方法,属性,索引器和事件的声明

不能实例化接口,它只能包含其成员的签名。接口不能有构造函数或字段。

接口也不允许包含运算符重载

在接口定义中不允许声明成员上的修饰符。接口成员总是公共的,不能声明为虚拟或静态的

 

 第五章  运算符和类型强制转换

一 运算符

int x=6; 

++x     x=7

x++     x=6

 

三元运算符 ?:

x ==1 ?"man":"men"

 

if(x==1)

返回man

否则

返回men

 

checked    执行溢出检查

{

b++;

}

 

if(i is object) 检查对象是否与特定的类型兼容

{

 

}

 

object o2=5;

string s2=o2 as string s2=null; 类型不兼容,返回null

 

sizeof 确定值类型需要的长度

 

二 类型的安全性

 

类型转换方式:隐式转换方式和显示转换方式

装箱和拆箱

 

三 对象的相等比较

四 运算符重载

五 用户定义的数据类型转换

 

第六章 委托与事件

一 委托的定义

委托就是方法传送给其他方法,.net委托是类型安全的,类似与函数指针

 

二 委托简单例子

  例子一:

   private delegate string GetAString();

   static void Main(string[] args)

{

   int x=40;

   GetAString firstStringMethod=new GetAString(x.ToString);

   Console.WriteLine("String is"+firstStringMethod());

}

  例子二:先定义 MathsOperations 类 里面有2个方法

 

  class MathsOperations
    {
        public static double MultiplyByTwo(double value)
        {
            return value * 2;
        }
        public static double Square(double value)
        {
            return value * value;
        }
    }

 

 

定义委托DoubleOp

 

   delegate double DoubleOp(double x);

 

实例化一个委托数组DoubleOp

 

    private void Do()
    {
          DoubleOp[] operations ={new DoubleOp(MathsOperations.MultiplyByTwo),
                                    new DoubleOp(MathsOperations.Square)};

           for (int i = 0; i < operations.Length; i++)
           {
                    textBox1.Text+="Using operations["+i+"]:"+"/r/n";
                    ProcessAndDisplayNumber(operations[i], 2.0);
                    ProcessAndDisplayNumber(operations[i], 7.94);
                    ProcessAndDisplayNumber(operations[i], 1.414);
                   
            }
     }

 

委托的实质方法传递给方法


     private void ProcessAndDisplayNumber(DoubleOp action, double value)
     {
                double result = action(value);
                textBox1.Text += "Value is "+value+ "/r/n"+"result of operation is   "  + result + "/r/n";
     }

 

 

 

输出如下:

 

Using operations[0]:
Value is 2
result of operation is   4
Value is 7.94
result of operation is   15.88
Value is 1.414
result of operation is   2.828
Using operations[1]:
Value is 2
result of operation is   4
Value is 7.94
result of operation is   63.0436
Value is 1.414
result of operation is   1.999396

 

 

如果使用匿名方法,就可以省去第一个类

 

修改如下:

 

DoubleOp multByTwo = delegate(double val){return val * 2;}

DoubleOp square= delegate(double val){return val * val;}

 

DoubleOp [] operations={multByTwo ,square};

 

由此可见,使用匿名方法的优点:降低了代码的复杂性,减少了系统开销

 

事件

发送器定义接受器要使用的委托,接受器将事件处理程序注册到事件中。连接事件处理程序的过程称为封装事件.


第七章 内存管理与指针

 后台内存管理

值数据类型:在释放变量时,其顺序总是与给它们分配内存的顺序相反.

引用数据类型:堆上的内存是向上分配的,堆栈是向下的.

 

释放未托管的资源

1.声明一个析构函数,作为类的一个成员

2.在类中实现System.IDisposable接口

 

不安全的代码

使用指针的原因:

1.向后兼容性

2.性能

 

编写不安全的代码

指针的语法

将指针转换为整数类型

指针类型之间的转换

void指针

指针的算法

sizeof 运算符

结构指针

类成员指针

 

指针的一个主要应用领域:

在堆栈中创建高性能。低系统开销的数组


第八章 字符串和正则表达式

创建字符串

 

string 和  stringbuilder 的区别:

 

string 是个不可变的数据类型,修改等操作要创建新的字符串

stringbuilder 一开始就分配好内存,修改等操作就在赋予StringBuilder实例的存储单元中进行

适用于对多个字符串的操作

 

格式化表达式

正则表达式

 

if (System.Text.RegularExpressions.Regex.IsMatch(this.textBox7.Text.Trim(), "^[0-9]*$"))


第九章 集合

对象组:

 

数组是System.Array类的一个实例

优点: (1)可以高效地访问给定下标的元素

        (2)编程很直观

缺点:  实例化需要指定数组的大小,以后不能添加,插入,或删除元素

 

其他在System.Collections命名空间中:

 

1.集合

(1)集合的概念:对象如果可以提供相关对象的引用,就是一个集合,称为枚举,它可以遍历集合中的数据项.

                     集合必须实现接口System.Collections.IEnumerable 和GetEnumerator()方法

数组也是集合,因为foreach命令可以用于数组

 

2.数组列表

  可以增大的,由System.Collections.ArrayList类表示

  ArrayList类有足够的存储单元来存储一定量的对象引用

 

3.Stack类

栈是另一种集合类型,适合于处理应用程序使用完后就删除的临时数据项.

后进先出原则  LIFO

Push()方法放在栈中,Pop()方法出栈.

 

4.Queue类

 先进先出原则 FIFO

 

5.SortedList类

其工作方式与LIFO FIFO不同,每一项都会指定一个用于引用该项的标识键.

 

6.字典和散列表

字典表示一种复杂的数据结构,允许按照某个键来访问元素,这个键可以是任何数据类型.

字典还可以叫映射或散列表.

 适用于:希望把对象保存为数组,但希望使用其他数据类型,不是数字类型,来给结构建立索引时候.

 

使用字典存储对象的其他场合:

(1)可以存储员工或其他人的信息,用他们的社会安全号作为索引。

(2)可以存储地址,索引是邮政编码.

(3)可以存储对象或人的任何数据,其索引是对象或人的名字.

 

 

7.泛型


第十章 泛型

为什么用泛型:

object类 没有类型安全性,值类型使用object类会有性能损失.

泛型类使用泛型类型,并可以根据需要用特定的类型替换泛型类型,保证了类型安全性

 

1.概述

 

泛型的优点:

(1)性能

装箱和拆箱操作很容易使用,但性能损失比较大

(2)类型安全

(3)二进制代码的重用

(4)代码的扩展

(5)命名约定

 

2.泛型集合类

List<T>类

(1)查找元素

(2)执行操作

(3)排序

(4)类型转换

 

使用Queue<T>类

 

使用LinkedList<T>类

是个双向链表,其元素指向它前面和后面的元素.

优点:如果元素应插入列表的中间,使用链表是非常快的

缺点:只能一个一个访问.

 

3.创建定制的泛型类

不能把null赋值泛型类型,泛型类型也可以实例化值类型,而null只能用于引用类型.

用default关键字,把null给引用类型.0给值类型

Tdoc=default(T);

 

4.泛型方法

5.泛型委托

6.其他泛型类型

(1)Nullable<T>

(2)EventHandler<TEventArgs>

(3)ArraySegment<T>

 

第十一章  反射

什么是反射:

反射描述了在运行过程中检查和处理程序元素的功能.

 

1.定制特性

定制特性允许把定制的元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入到程序集中。接着就可以在运行期间使用反射的一些功能检查这些元数据了。

 

(1)AttributeUsage特性

(2)指定特性参数

(3)指定特性的可选参数

 

2.反射

System.Type类

Assembly类


第十二章 错误和异常

 异常类

 

StackOverflowException

EndOfStreamException

OverflowException

ArgumentException

IndexOutOfRangeException

 

捕获异常

try

catch

finally

 

用户定义的异常类


第十三章 线程

线程

线程是程序中独立的指令流.

 

多线程应用程序

应用程序可以有任意多个线程。第一个线程总是Main()方法

 

线程的处理

线程是使用Thread类来处理的

 

使用ThreadPool创建线程


第十五章  程序集

 

程序集:

私有程序集和共享程序集

私有程序集没有管理,注册,和版本设置等问题,只有用户自己的应用程序在使用私有程序集时才有版本问题

共享程序集,有几个应用程序都使用这个程序集,且与它有一定的依赖关系。共享程序集必须有一个特殊的版本号,唯一的名称。

 

程序集的特性:

1。程序集是自我描述的

2。版本的相互依赖性在程序集的清单中进行了记录

3。程序集可以并行加载

4。应用程序使用应用程序域来确保其独立性

5。安装非常简单

 

程序集的结构

程序集由描述它的元数据,描述导出类型和方法的类型元数据,MSIL代码和资源组成.

 

程序集的清单

它是元数据的一部分,描述了程序集和引用它所需要的所有信息,并列出了所有的依赖关系。

 

清单的组成:

标识

文件列表

引用程序集的列表

一组许可请求

导出的类型


第十九章 .net数据访问

ado.net 4个数据库客户命名空间

1.sqlserver

2.oracle

3.odbc

4.olebc

 

新特性:以断开连接的方式工作

 

数据库连接:

using System.Data.SqlClient;

string source = "server=localhost;database=MakeCard;uid=sa;pwd=123";

SqlConnection mycon = new SqlConnection(source);
mycon.Open();

 

//dosomething

 

mycon.Close();

 

高效的使用连接

1.利用try..catch..finally语句块

 

try

{

     //

     conn.Open();

}

catch(Exception ex)

{

}

finally

{

conn.Close();

}

 

2.使用using语句块

using(SqlConnection conn=new SqlConnection(source))

{

 conn.Open();

}

 

无论块是否退出,using子句都会确保关闭数据库连接

 

事务处理:

SqlConnection conn=new SqlConnection(source);

conn.Open()

SqlTransaction tx=conn.BeginTransaction();

// do some command

tx.Commit();

conn.Close();

 

SqlCommand cmd=new SqlCommand(select,conn);

SqlDataReader reader=cmd.ExecuteReader();

while(reader.Read())

{

     reader[0];

     reader[1];

}

reader.Colse();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值