企业考勤系统的设计与实现外文文献译文上课讲义.docx

上传人:b****7 文档编号:9456460 上传时间:2023-02-04 格式:DOCX 页数:12 大小:26.60KB
下载 相关 举报
企业考勤系统的设计与实现外文文献译文上课讲义.docx_第1页
第1页 / 共12页
企业考勤系统的设计与实现外文文献译文上课讲义.docx_第2页
第2页 / 共12页
企业考勤系统的设计与实现外文文献译文上课讲义.docx_第3页
第3页 / 共12页
企业考勤系统的设计与实现外文文献译文上课讲义.docx_第4页
第4页 / 共12页
企业考勤系统的设计与实现外文文献译文上课讲义.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

企业考勤系统的设计与实现外文文献译文上课讲义.docx

《企业考勤系统的设计与实现外文文献译文上课讲义.docx》由会员分享,可在线阅读,更多相关《企业考勤系统的设计与实现外文文献译文上课讲义.docx(12页珍藏版)》请在冰豆网上搜索。

企业考勤系统的设计与实现外文文献译文上课讲义.docx

企业考勤系统的设计与实现外文文献译文上课讲义

C#编程语言概述

1C,C++和C#的历史

C#编程语言是在C和C++编程语言的精神上创造出来的。

这说明了其拥有强大的功能和简单的学习曲线。

但是不能说C#与C和C++相同,因为C#是建立在这两者基础之上的,微软灵活地删除了一些比较繁琐的功能——比如指针。

本节将了解C和C++语言,并追踪其演变成C#的历史。

C语言最初目的是为了在UNIX操作系统上使用。

它用来创建了许多UNIX应用程序,包括C编译器,并最终用来写UNIX本身。

它在学术领域被广泛地接受,包括商业领域,以及软件厂商,如微软和Borland发布了为个人电脑服务的C编译器。

原始的WindowsAPI的设计采用C语言来编写Windows代码,而最新的一组核心Windows操作系统的API至今为止仍然保留C编译器。

从设计的角度来看,C缺乏一些细节,其他语言如Smalltalk中已经接受了:

一个对象的概念。

你将在第8章“编写面向对象的代码”中了解更多关于对象的描述。

现在,我们认为一个对象是作为数据的集合,并且可以对数据执行一组操作的。

对象类型的编码可以用C来完成,但对象的概念不会强制出现在这个语言中。

如果你想构造你的代码,使之类似于一个对象,可以。

如果你不想这么做,C也确实不会介意。

对象是不是这门语言的固有部分,所以很多人并没有太注意这种编程范式。

面向对象开发的概念开始获得认可后,很明显,C需要细化到去包含这一新的方式。

C++的开发包含了这种改进,它被设计成可以兼容C(比如,所有的C程序也将是C++程序,并可以用C++编译器编译)。

C++语言主要是增加了对对象这个新概念的支持。

C++语言额外提供了了对类(对象的“模板”)的支持,并启用了一整代的C++程序员去思考它及其行为的使用规范。

C++语言是对C的改进,但它仍然存在一些缺点。

C和C++是很难得到处理的。

不像易于使用的语言,如VisualBasic,C和C++是非常底层的,并要求你编写大量的编码,来使你的应用程序运行良好。

你必须编写自己的代码来处理类似于内存管理和错误检查的问题。

C和C++可以实现非常强大的应用程序,但你需要确保你的代码编写得很好,一个漏洞就可以使整个应用程序崩溃或行为异常。

由于固定采用C向后兼容C++的设计目标,C++无法打破C的底层特性。

微软设计的C#,保留了很多C和​​C++的语法。

对那些语言熟悉的开发者可以很快地掌握C#。

并且尽快地开始代码的编写。

对于C#来说,它有一个很大的优势,就是它的设计者选择不让它去兼容C和C++。

虽然这可能看起来像一个糟糕的处理,但它实际上是一个好消息。

C#剔除了一些使得C和C++难以实现的东西。

因为所有的C代码也是C++代码,C++必须保留C中所有的原始怪癖和不足。

C#中开始用一个纯净的环境,没有任何兼容性的要求,因此可以保留其前辈的长处,并且丢弃使得C和C++程序生存困难的弱点。

2引入C#

C#这门在.NETFramework中被引进的全新语言,是从C++衍生出来的。

然而,C#是一个现代化的,面向对象的(自下而上的)、类型安全的语言。

3语言特征

下面的章节来看看C#语言的一些特点。

如果它们中的某些概念对你来说很陌生,不要担心,所有这些都在后面的章节中详细介绍。

4类

在C#中的所有代码和数据必须包含在一个类中。

你不能在类外定义一个变量,同样的你也不能写任何不在类中的代码。

类可以有构造函数,当创建该类的对象时,会自动生成它的析构函数;当类的对象被释放时,类的析构函数也就被销毁了。

类支持单继承,并且所有类最终都是从基类调用对象派生出来的。

C#支持各版本的技术,可以保证随着时间的推移,你的类始终保持与使用早期版本时的类代码的兼容性。

下面让我们来看一个叫做Family的类的例子。

这个类包含了两个静态域来保存成员的第一个名字和最后一个名字。

同时用一个方法来返回成员的全名。

classClass1

{

publicstringFirstName;

publicstringLastName;

publicstringFullName()

{

}

returnFirstName+LastName;

}

注:

单继承意味着一个C#类只能从一个基类中继承。

在C#中,你可以将你的类打包到一个名为namespace的类的集合里面。

命名空间有名称,可以在逻辑上帮助类集进行分组。

在你开始学习C#时,很明显,有关于.NETFramework所有命名空间都是从系统开始的。

微软还选择了包括一些有助于兼容以前代码的类和API的访问通道。

这些类都包含在Microsoft命名空间内。

5数据类型

C#允许你使用两种类型的数据:

值类型和引用类型。

值类型变量保存实际值。

引用类型保存实际的值储存在内存中其他的位置信息。

基本类型如字符型,整型,浮点型,以及枚举型和结构体类型,它们都是值类型。

而对象和数组类型被处理成了引用类型。

C#预定义了引用类型(对象和字符串),同时也预定义了值类型(短字符,短整型,整型,长整型,无符号字符型,无符号短整型,无符号整型,无符号长整型,浮点型,双精度浮点型,布尔型,字符型和十进制类型)。

你也可以在代码中定义自己的值类型和引用类型。

所有的值类型和引用类型最终都会被一个由基本类型派生出的对象执行。

C#允许将一个类型的值转换为另一种类型的值。

你可以使用隐式转换和显式转换来实现。

隐式转换总是能成功,并且不会丢失任何信息(例如,你可以转换将一个整型变量隐式转换成一个长整型变量,而不会丢失任何信息,因为长整型变量比整型变量存储的容量大)。

显式转换可能会导致你丢失部分数据(例如,将一个长整型变量转换为一个整型变量可能会导致数据丢失,理由同上)。

你必须在你的代码中编写转换运算符,来实现显式转换。

6交叉引用

请参阅第3章,“同变量一起工作”来了解关于隐式转换和显式转换的详细信息。

你可以在C#中使用这一维数组和多维数组。

多维数组可以是矩阵,这个阵列和多维数组具有相同的行列数;或者是锯齿状的,其中每个阵列的具有不同的尺寸。

类和结构体可以拥有数据成员,称之为属性和域。

域是封装起来的类或结构体相关的变量。

你可以定义一个称为Employee的结构体,例如,有一个称为Name的域。

如果你定义一个名为CurrentEmployee的Employee类型的变量,你可以通过编写CurrentEmployee.Name来获取雇员的姓名。

属性就像域,但是可以让你编写代码来指定代码访问值时应该发生什么。

如果员工的名字必须从数据库中读取,例如,你可以编写代码:

“当有人问Name属性的值时,从数据库中读取名字,并且以字符型返回这个值。

7函数

函数是一段可以随时调用的代码,当它被调用时可以有返回值,也可以没有返回值。

有一个函数的例子在前面展示过,在本章中,在Family这个类中有函数的例子,Family类中实现显示全名的功能的就是一个函数。

函数通常会联合一些返回信息的代码,而方法通常不返回信息。

不过对于我们而言,我们一般都会把它们都归结于函数。

函数可以有四种类型的参数:

输入的参数有值传递到函数内,但是函数无法改变它们的值。

输出参数没有任何值,当他们被传递给函数时,函数可以给它们值并且将这个值传回给它的调用者。

引用参数通过引用传递另外的一个值。

它们有一个值传递给函数,并且该值可以在函数内部被改变。

参数的参数在列表中定义了一个数组变量。

C#和CLR携手合作,提供自动内存管理。

你并不需要编写“为一个整数分配足够的内存”或者“留足够的空间让这个对象使用”这样的代码。

CLR监视你的内存使用,并且自动在你需要时自动地取回。

同时,当它检测到它不再被使用(这也被称为垃圾收集)时会自动释放内存。

C#提供了大量的运算符,使你能够编写数学运算和移位运算的表达式。

它们当中的大量(但并不是所有)运算符可以被重新定义,从而允许你更改这些运算符的作用。

C#允许你在一长串代码中定义不同的执行路径,使用关键字如if,switch,while,for,break和continue,能够使代码根据变量值的不同分入到不同的路径中。

类中可以包含代码和数据。

每一个类成员都有一个访问权限,它定义了这个成员对其他对象的可见性。

C#提供了public,protected,internal,protectedinternal和private这些可接近的范围。

8变量

变量可以被定义为常量。

常量是在你的代码的执行过程中不能被改变值。

例如圆周率的值是常量的一个很好的例子,因为它的值不会在你的代码的运行过程中发生改变。

枚举类型声明为一组相关的常量指定名称。

例如,你可以定义一组枚举类型,使用Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune和Pluto作为它们的值,并且能够在代码中使用这些名字。

在代码中使用枚举类型的名字比你使用数字来表示每个行星更具可读性。

C#提供了用于定义和处理事件的内置机制。

如果你写了一个需要执行很长时间的类,你可能需要在操作完成时调用的一个事件来结束这个类。

客户可以订阅该事件,并在他们的代码中使用,这使得当你完成你的冗长的操作得到的通知。

这个事件处理机制在C#机制使用了委托,这是引用的函数变量。

注:

事件处理程序是一个在你的代码中的程序,当一个事件发生时它决定了将会发生什么动作,如用户点击一个按钮来执行的操作。

如果你的类保存了一个值,客户将会想要将你的这个类看成是一个数组来访问这个值。

你可以写一段被称为索引的代码,使你的类就像是一个数组一样的被访问。

例如,假设你写了一个名为Rainbow的类,类,包含了一组在彩虹中的颜色。

访问者可能需要编写MyRainbow[0]检索在彩虹的第一种颜色。

你可以在你的Rainbow类中写一个索引,来定义调用者访问你的类时应该返回什么样的内容,就好像它是一个值的数组。

9接口

C#支持接口,它聚集了属性,方法和阐述一套功能的事件。

C#类可以实现接口,它通过接口告诉使用者该类支持的接口中记录的功能集。

你可以实现接口而不妨碍任何现有的代码,最大限度地减少兼容性问题的干扰。

一旦接口被公开了,它就不能被改变,但它可以通过继承来进化。

C#类可以实现多个接口,虽然这个类只能从一个基类继承。

让我们来看看一个真实的例子,在C#中接口具有非常积极的作用。

许多应用程序支持当今的加载项。

假设你已经创建了编写应用程序的代码编辑器。

这个代码编辑器被执行时,已具有了加载插件的能力。

要做到这一点,插件必须遵循一些规则。

该DLL加载必须导出一个名​​为CEEntry的函数,DLL的名称使用CEd作为文件名的开头。

当我们运行我们的代码编辑器时,它扫描以CEd开头的所有DLL文件的工作目录。

当它找到一个,就将它装载下来;然后它使用GetProcAddress的定位DLL中的CEEntry函数,从而验证了你遵循所有必要的规则来创建一个加载项是必要的。

创建并加载加载项的这个方法是非常沉重的负担,因为它负担更多比核查必要的代码编辑器的责任。

如果接口是在这种情况下使用的,你的DLL加载项可以运用于一个接口,从而保证所有必要的方法,属性和事件出现在DLL中,并作为文件指定的函数运行。

10属性

属性声明你的类的CLR的附加信息。

在过去,如果你想使你的类自描述,你必须采取断开的方法,其中的文件被存储在外部文件中,如IDL甚至HTML文件。

通过你这个开发者的努力,属性解决了这个问题,它在类中约束了任何种类的信息。

例如,你可以使用一个属性在一个类中嵌入文档的信息。

属性同样可以用于在类中约束运行时间,定义使用时应该如何行动。

可能性是无穷的,这就是为什么微软会在.NETFramework中包含许多预定义的属性的原因。

11编译C#

C#代码通过C#编译器运行生成两类重要信息:

代码和源数据。

接下来的部分描述了这两个项目,完成了建立在.NET代码上的二进制的审查,那就是汇编。

12Microsoft中间语言(MSIL)

被C#编译器输出的代码是写在一种叫做微软中间语言中的,或者称为MSIL语言。

MSIL是由一组特定的指定你的代码应该如何执行的指令组成的。

它包含了操作的说明,如,变量的初始化操作的说明,调用对象的方法和错误处理,这里仅举几例。

C#是不是在编译过程中的源代码更改成MSIL的唯一语言。

所有.NET兼容的语言,包括VisualBasic.NET和C++,当它们的源代码编译完成后都会产生MSIL。

因为所有的.NET语言编译器有相同的MSIL指令集,所有的.NET语言都有相同的运行时间,所以不同的语言,不同的编译器代码,可以很容易地一起工作。

对于物理CPU而言,MISL并不是一套明确的指令。

因此它不知道任何关于你机器CPU的事,同样的你的机器也不知道任何有关MSIL的事。

那么,当你的CPU不能读取MSIL的时候,你的代码将如何运作呢?

答案是,当代码在第一次运行时,MSIL代码被转入了CPU说明代码中。

这一过程被称为“刚好及时”编译或JIT。

JIT编译器的工作是将你的通用MSIL代码翻译成可由你的CPU执行的机器代码。

你可能会想知道在进程中一个额外的步骤是什么样的。

为什么产生MSIL时,编译器可以直接生成CPU特定的代码?

总之,编译器在之后做了这些。

有一下几个原因。

首先,MSIL使你的编译后的代码可以很容易地转移到不同的硬件上。

假设你已经写了一些C#代码,并且你想让它在你的台式机和手提设备上都可以运行,这两个设备很可能有不同类型的CPU。

如果你只有一个针对特定CPU的C#编译器,那么你需要两个C#编译器:

一个针对台式机的CPU,另一种是针对手提设备的CPU。

你必须编译两次代码,以确保你把正确的代码运行在正确的设备上。

有了MSIL,你只需要编译一次。

你的台式机上安装了.NETFramework,它包括的JIT编译器用来翻译成MSIL中台式机CPU的特定代码。

在手提设备上安装了.NETFramework,它包括的JIT编译器用来翻译同样MSIL中针对手提设备CPU的特定代码。

你现在有一个单一的MSIL代码库,可以在具有.NETJIT编译器的任何设备上运行。

该设备上的JIT编译器能保证使你的代码很好地运行。

编译器使用MSIL的另外一个原因是,该指令集可以由一个验证进程很容易地读出。

JIT编译器的部分工作是核实你的代码,以确保它能够尽可能的清晰。

验证进程可确保你的代码正确地访问内存,并且调用期望特定类型的方法时,它使用了正确的变量类型。

这些检查确保你的代码不执行任何会使代码崩溃的指令。

MSIL指令集是为了使这个验证过程相对简单。

具体的CPU指令集的代码,是为了快速执行代码而优化的,但它们产生的代码是很难阅读的,因此难以核实。

有一个可以立刻输出CPU特定代码的C#编译器能够使代码的检查很困难或者甚至不可能实现。

允许在.NETFrameworkJIT编译器来验证你的代码,确保你的代码通过一个漏洞很大的路径访问内存并且变量类型会被正确地使用。

13源数据

编译过程还输出源数据,这是.NET代码分享代码部分一个很重要的内容。

无论你使用C#来构建一个客户端的应用程序,还是用C#建一个类库被别人用在应用程序上的类库,你都会想利用一些已经编译好的.NET代码。

该代码可以由微软的.NETFramework的一部分来提供,或者它可以通过在因特网上的用户提供。

使用外部代码的关键是让C#编译器知道什么类和变量在其他的代码库,以使它可以匹配你正在使用的预编译的代码库中找到的你正在编写的代码的源代码。

对于你的编译代码而言,源数据可以看成是“目录”。

C#编译器编译的代码与源数据生成的MSIL放在一起。

这个源数据准确地描述你所编写的类,以及它们是如何构成的。

所有类的方法和变量的类型完全地在源数据中被描述,准备好被其他应用程序来读取。

例如,VisualBasic.NET可以.NET库中读取源数据来提供对一个特定的类列出所有,可用于特定类方法的智能感知能力。

如果你曾经使用COM(组件对象模型)工作,你可能已经熟悉了类型库。

类型库的目的是为COM对象提供类似功能的“目录”。

然而,类型库有一定的局限性,事实上并不是所有的关于目标的数据都能被放入类型库中。

.NET中的源数据没有这个缺点,所有的用来描述类的信息的代码被放置在源数据中。

你可以把源数据看作是具有所有COM类型库的好处。

14构件

有时候,你会使用C#来构建一个终端的应用程序。

这些应用程序打包为扩展名为.exe的可执行文件。

Windows也都是以.exe文件来运行一个应用程序的,并且C#完全支持创建.exe文件。

但是,也会有几次你不希望建立一个完整的应用程序。

相反,你可能想要建立一个可以被其他人使用的代码库。

你可能还需要在C#中建立的一些实用工具类,例如,传给一个想要在VisualBasic.NET应用程序中使用你的类的VisualBasic.NET的开发者。

在这种情况下,你将不会构建一个完整的应用程序,取而代之的是建立一个构件。

构件是一个源数据的代码包。

当你在一个构件中部署一组类时,你会把这个构件当作一个单元来配置,且这些类将会分享同样层级的版本控制,安全信息和动态需求,将构件看作一个“逻辑的DLL”。

如果你熟悉MicrosoftTransactionServer或COM+,那么你可以把构件看作与.NET等价的包。

有两种类型的构件:

私人构件和全局构件。

当你建立你的构件,无论你想建立一个私有或全局构件都不需要指明。

但当你部署组件时的区别是显而易见的。

使用私有构件时,你只能使你的代码被单独的应用程序访问。

你的构件是一个类似于DLL的包,并且当你的应用程序运行它时,被安装进同样的目录。

展开这个私有构件时,可以使你的代码的唯一应用程序是在同一目录下组件的可执行文件。

如果你想要在更多的应用程序中分享你的代码,你或许要考虑将你的代码配置成为一个全局的构件。

全局构建可在任何系统上的.NET应用程序使用,并且不区分安装它的目录。

微软将构件作为.NET框架的一部分,并且每个微软构件被安装为一个全局构件。

.NET结构在一个被称作全局构件存储器的设备中包含了一个全局构件的列表,。

并且微软.NET框架SDK中包含了公用的可以从全局构件存储器中安装和删除构件的功能。

“碧芝”隶属于加拿大的beadworks公司。

这家公司原先从事首饰加工业,自助首饰的风行也自西方,随着人工饰品的欣欣向荣,自制饰品越来越受到了人们的认同。

1996年'碧芝自制饰品店'在迪美购物中心开张,这里地理位置十分优越,交通四八达,由于是市中心,汇集了来自各地的游客和时尚人群,不用担心客流量问题。

迪美有300多家商铺,不包括柜台,现在这个商铺的位置还是比较合适的,位于中心地带,左边出口的自动扶梯直接通向地面,从正对着的旋转式楼拾阶而上就是人民广场中央,周边4、5条地下通道都交汇于此,从自家店铺门口经过的90%的顾客会因为好奇而进看一下。

在某种意义上,C#可以看作是.NET面向Windows环境的一种编程语言。

在过去的十几年里,Microsoft给Windows和WindowsAPI添加了许多功能,VisualBasic和C++也经历了许多变化。

尽管VisualBasic和C++已经成为了非常强大的语言,但这两种语言也存在问题,因为它们保留了原来的一些内容。

1、你一个月的零用钱大约是多少?

在VisualBasic6和更早的版本中,它的主要优点是很容易理解,许多编程工作都很容易完成,基本上隐藏了WindowsAPI和COM组件结构的内涵。

这样做的缺点是,VisualBasic中从来没有真正面向对象,这样,大型的应用程序很快会变得杂乱无章,难以维护。

除了这一点,因为VisualBasic语法是从BASIC(BASIC主要是为了让初级程序员更容易理解,而不是为了编写大型商业应用程序)的早期版本继承来的,所以不能真正成为结构化或面向对象的编程语言。

自制饰品一反传统的饰品消费模式,引导的是一种全新的饰品文化,所以非常容易被我们年轻的女生接受。

另一方面,C++在ANSIC++语言定义中有其自己的根。

它与ANSI不完全兼容,因为Microsoft是在ANSI定义标准化之前编写C++编译器的,但已经相当接近了。

遗憾的是,这导致了两个问题。

首先,ANSIC++是在十几年前的技术条件下开发的,因此不支持现在的概念(例如Unicode字符串和生成XML文档),某些古老的语法结构是为以前的编译器设计的(例如成员函数的声明和定义是分开的)。

其次,微软一直试图演变C++成为专在Windows上的高性能任务的语言,以达到在语言中避免添加大量Microsoft专用的关键字和各种库的目的。

其结果是,在Windows中,该语言已经变得一塌糊涂。

只要问问C++开发人员字符串有多少个定义方式,就可以说明这一点:

char*、LPTSTR、string、CString(MFC版本)、CString(WTL版本)、wchar_t*和OLECHAR*等。

现在进入.NET时代——一种全新的环境,它对这两种语言都进行了新的扩展。

Microsoft给C++添加了许多Microsoft专用的关键字,并把VB演变为VB.NET,保留了一些基本的VB语法,但在设计上完全不同,从实际应用的角度来看,VB.NET是一种新语言。

在这种情况下,Microsoft决定给开发人员另一个选择——专门用于.NET、具有新起点的语言,即VisualC#.NET。

据官方介绍,微软将C#定义为一个“从C和C++衍生的简单的、现代的、面向对象的和类型安全的编程语言。

”大多数独立评论员可能会更改为“从C,C++和Java的。

”这样的描述在技​​术上是准确的,但没有涉及到该语言的真正优点。

在语法上,C#是非常类似C++和Java的,很多关键字都是一样的,C#也使用类似于C++和Java的块结构,并用括号({})来标记代码块,用分号分隔各行语句。

一段我们对C#代码的第一印象是,它看起来很像C++或Java代码。

但在这些表面上的类似性的背后,C#是一个比C++更容易学习,但比Java难一些。

它的设计比这两个语言更加符合现代开发工具,同时具有VisualBasic的易用性、高性能以及C++的低级内存访问性。

C#包括以下一些特性:

2、你大部分的零用钱用于何处?

❑完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理。

❑定义完整、一致的基本类型集。

(2)文化优势❑对自动生成XML文档说明的内置支持。

月生活费人数(频率)百分比❑对动态分配的内存进行自动清除。

虽然调查显示我们的创意计划有很大的发展空间,但是各种如“漂亮女生”和“碧芝”等连锁饰品店在不久的将来将对我们的创意小屋会产生很大的威胁。

❑可以用用户定义的特性来标记类或方法。

这可以用于文档说明,对编译有一定的影响(例如,把方法标记为只在调试时编译)。

❑对.NET基类库的完全访问权,并易于访问WindowsAPI(在你真的需要它,并不是所有的时候)。

7、你喜欢哪一类型的DIY手工艺制品?

❑如果需要,可以使用指针和直接内存访问,但C#语言可以在没有它们的条件下访问内存。

(一)创业机会分析❑以VB的风格支持属性和事件。

1、现代文化对大学生饰品消费的影响❑改变编译器选项,可以把程序编译为可执行文件或.NET组件库,该组件库可以用与ActiveX控件(COM组件)相同的方式被其他代码调用。

❑C#可以用于编写ASP.NET动态Web页面和XMLWeb服务。

应该指出,对于上述大多数特性,VisualBasic.NET和ManagedC++也具备。

但C#从一开始就使用.NET,对.NET特性不仅是完全支持的,而且提供了比其他语言更合适的语法。

C#语言本身非常类似于Java,但也有一些改进:

特别是,Java不是为应用于.NET

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1