1、各种类型的等级
类级:用struct enum class delegate定义,如Dataset DataGrid OledbCommand 动词:定义一个类
对象(实例)级:用sbyte short int long float double string定义,如conn comm opera 动词:实例化、声明一个对象
变量级:直接使用x y z str 动词:赋值、初始化
域也叫成员变量
2、面向对象的三大特性
面向对象三大特性是封装、继承和多态
(1)封装技术
封装是OOP编程中的一个重要手段,就是指把具体实现的逻辑细节在内部隐藏起来,对外部只暴露公共的、规范的接口和调用方法,从而隐藏实现细节,使在使用的时候不用去考虑其内部的运作模式等等具体细节。以后即使是要修改其逻辑也不会影响外部调用的,称为封装,主要是为了降低组件之间的耦合度,以提高扩展性和维护性。
这是面向对象编程的第一个特征,封装性。
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。
(2)多态性
接口的多种不同的实现方式即为多态。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
多态性通过派生类重载基类中的虚函数型方法来实现。
例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
public class DrawDemo
{
public static int Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
return 0;
}
}
result:
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例
(3)继承
一个自定义类,并想不需要实例化该类,而直接调用类中的方法时,有三种方法:
1、定义一个静态方法
2、使用方法时直接使用(new className).method();
3、让调用的类继承此类,具体方法如下:
例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例
namespace GrcFrameWork
{
//定义类
public class GrcCommmon
{
public void Alert(string AlertText, string Code)
{
}
}
//实例化类
public abstract class GrcPage
{
public GrcCommmon grcCommon//此为一个属性(只读)
{
get
{
return new GrcCommmon();
}
}
}
}
//调用
public partial class myClass : GrcFrameWork.GrcPage
{
protected void Page_Load(object sender, EventArgs e)
{
grcCommon.Alert("", "")
}
}
例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例例
3、事件
对象可以激活事件,作为它们处理的一部分。
使用事件可以创建事件驱动的应用程序,这类应用程序比读者此时所能想到的多得多。例如,许多基于Windows的应用程序完全依赖于事件。每个按钮单击或滚动条拖动操作都是通过事件处理实现的,其中事件是通过鼠标或键盘触发的。
4、三层架构
ASP.NET中“三层架构”的开发方法,其思想跟JAVA的类似,JAVA中的三层架构为前端的Html、Jsp、Serlet,中间层为JavaBean、EJB,后面为数据库服务器。在ASP.NET中,前端为HTML、asp、aspx等,中间层为.vb、.cs等文件编译而成的.dll控件,后面为数据库服务器。
在三层架构中,数据层通过中间层来连接以及操作,前端给中间层传递参数,并接受中间层的返回值。一般情况下,主要关注的是中间层与前端的数据交互,中间层可被称为组件,一般为.dll文件。在ASP.NET中.dll文件不用考虑注册的问题,拷贝过来就可以用。
在设计模式上,三层架构的三层分别成为:表示层,业务层和数据层。
(1)表示层:
提供应用程序的用户界面,通常也包括Window窗体和ASP.NET页面的使用。
(2)业务层:
业务层实现应用程序的业务功能。
(3)数据层:
数据层提供对外部系统(如数据库)的访问,该层涉及到的主要.NET技术是ADO.NET的数据库访问技术.
5、CS/BS架构
首先咱们讨论一下文件上传下载系统的目的和要求:使用方便、管理方便、安全。
若想使用方便,应该是客户端免安装的,所以,使用CS结构并不合理,除非使用通用工具,比如成熟的ftp工具。
管理方便,如你理解,服务器管理用BS模式,好处就是管理员可以漫游,便于管理,然而管理员有没有全球漫游的必要?
但由于BS不需要专门的客户端,因此受攻击的可能性更大。
综上所述,我觉得你的理解不一定正确,最好问一下你的指导老师。你可以在看完下面的内容后再问。
不管怎末说,说服务器端用BS模式、客户端用CS模式的说法是显然不对的,你补充的,尽管经过上面分析,不一定合理,但还是语义还是没有问题,即服务器管理用BS模式,用户使用CS模式完成上传下载。
如果一定要按你说的做,需要一下知识和技术:
(1)CS架构:
首先,工程上,应该采用成熟的FTP客户端工具作为首选方案。服务器上则使用ServerU或IIS等FTP服务器端工具。
如果一定要自己开发,应该学习Sockets编程、Windows服务项目的开发,服务器端用Windows服务打开监听线程,接受客户端连接,并将客户端请求存入队列(System.Collections.Queue对象),等待主线程处理,主线程处理请求,并调用通信线程发送文件数据。
客户端使用同样的结构,主线程发送请求,并处理队列中的数据,并存为文件,通信线程负责用同样的端口连接服务器,发送请求,接收服务器发来的文件数据。
显然,这需要定义协议结构,或者使用FTP协议规程。
(2)BS架构管理服务器:
用ASP.NET开发网站,对提供下载的目录进行列表,允许网站用户删除、重命名、移动、复制、上传(创建)、下载(读取)文件和子目录,也就是说,编写一个资源管理器的Web实现。
需要了解IIS发布网站、System.IO命名空间下的文件和目录管理操作。为了网站安全,应该使用身份验证。
总之,这时一个很复杂的系统。
反之,如果用户使用BS模式上传、下载,管理员使用CS模式在局域网中进行管理,则简单得多。更具可行性、可用性、可靠性。网页中只需要FileUpLoad控件进行上传,GridView控件列出文件允许下载即可。管理界面中则只需要TreeView、ListView等控件以NetBios机器名或IP地址,通过服务器的Windows身份验证,模拟一个资源管理器即可。
哪怕是性能等价的,两种方案的工作量则相差比加大。所以我说你的老师不会如此布置。
16、浮点类型误差
I.问题描述之一
float a = 0.65f;
float b = 0.6f;
float c = a - b;
Console.WriteLine(c);
结果:
0.0499999523
其根本原因是计算机所使用二进制01代码无法准确表示某些带小数位的十进制数据。
II.问题描述之二
#include <stdio.h>
main()
{
float a,b,c;
a=0.99999999;
b=1.0;
if(a==b)
printf("equal!");
getch();
}
结果:
equal!
III.原理解析
将一个十进制数值转换为二进制数值,需要通过下面的计算方法:
1.整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。
2.小数部分:十进制小数转换为二进制小数,采用"乘2取整,顺序排列"法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称"乘2取整法"。
3.含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。
eg.
将十进制数值25.75转换为二进制数值,步骤如下:
25(整数部分)
25/2=12......1
12/2=6.......0
6/2=3......0
3/2=1......1
1/2=0......1
(25) 10=(11001) 2
0.75(小数部分)
0.75*2=1.5......1
0.5*2=1......1
(0.75) 10=(0.11) 2
(25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2
按照上述方法,我们将0.65及0.6转换为二进制代码:
(0.65)10 = (0.101001100110011001100110011001100110011......)2
(0.6) 10 = (0.10011001100110011001100110011001100110011......)2
★IEEE754标准
既然有的十进制小数用二进制是永远也无法精确表示的,那么为此浪费过多的存储空间没有意义,所以对小数的存储有了精度的规定,精度即小数部分的位数。而且,实际应用中的小数通常用科学计数法表示,例如1.0*10^2,0.1*10^3,0.01*10^4都可以表示100。小数点位置的浮动和不同指数搭配而成的不同记法可以表示同一个数,这也是小数被成为浮点数的原因。因为在浮点数的存储上有这些问题导致不统一,所以必须要有一个标准来规范它。
国际上通用的标准为IEEE754标准:
IEEE754标准规定一个实数V可以用V=(-1)s×M×2^E的形式表示,说明如下:
(1)符号s(sign)决定实数是正数(s=0)还是负数(s=1),对数值0的符号位特殊处理。
(2)有效数字M是二进制小数,M的取值范围在1≤M<2或0≤M<1。
(3)指数E(exponent)是2的幂,它的作用是对浮点数加权。
其中1≤M<2且指数部分E的各位不全为0也不全为1的表示称为规格化浮点数。