搜档网
当前位置:搜档网 › 四MQI的主要调用

四MQI的主要调用

四MQI的主要调用
四MQI的主要调用

WebSphere MQ Solution Designer 认证考试996 准备: 第4 部分,主要MQI 调用

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年5 月29 日

准备IBM 认证考试996:WebSphere MQ Solution Designer。本教程讨论Message Queuing Interface (MQI) 中的主要调用,MQI 是用于开发WebSphere MQ 应用程序的应用程序编程接口(API)。这是有关WebSphere MQ Solution Designer 的包括五个教程的系列中的第四个教程。

开始之前

关于本系列

WebSphere? MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加IBM 认证考试996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于WebSphere MQ 的解决方案的中级设计人员。

关于本教程

本教程是旨在帮助您准备IBM 认证考试996:WebSphere MQ V6.0, Solution Design 的系列中的第四个教程。本教程介绍Message Queuing Interface (MQI) 中的主要调用,包括常规事务调用和用于放置及获取消息的调用。其中还将讨论打开队列、消息描述符和用于控制消息检索的技术。完成本教程后,请继续学习第五个教程,其中介绍了其他MQI 主题。

目标

完成本教程后,您应该熟悉:

MQI 的常规事务调用:MQCONN、MQOPEN、MQCLOSE 和MQDISC。

MQPUT 谓词(verb)。

打开队列。

消息描述符。

MQGET 谓词。

MQPUT1 谓词。

控制消息检索。

先决条件

本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

事务管理和数据库产品

系统管理

基本编程概念

数据通信和网络

信息技术安全概念

系统要求

本教程中的示例使用WebSphere MQ V6.0 for Windows? 和Rational? Application Developer V6.0 for Windows 开发。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ

Rational Application Developer

搜索更多相关主题的帖子: Solution Designer MQI WebSphere 考试Solution Designer MQI WebSphere 考试

查看详细资料

TOP

阳春三月

版主

帖子141 积分1311 金钱1000 W币注册时间2008-7-7 个人空间发短消息加为好友当前离线2# 大中小发表于2008-7-7 16:46 只看该作者

WebSphere入门开窍班第6期:剪不断理还乱的Portal问题汇总| 谁是未来存储架构师?成就下一代信息架构| 《WebSphere中国》杂志免费领取

引言

本部分介绍Message Queue Interface (MQI)。其中列出MQI 调用,并讨论MQI 使用的数据类型、结构和常量。本部分还将描述受支持的编程语言,以及如何构建应用程序,并研究可用于消息应用程序的Java API。

MQI 调用

MQI 是一个简单的高级编程接口,由十三个调用组成。这些调用可划分为主要和次要调用。主要调用是业务应用程序中最常用的调用。次要调用是不太常用的调用。这个区别是非常随意的。

主要调用及其功能包括:

次要调用及其功能包括:

基本数据类型

WebSphere MQ 为MQI 调用中使用的参数定义了基本数据类型。这些类型被定义为非特定于编程语言的,并为每种受支持的编程语言提供了特定于编程语言的对应定义。

一些较常用的基本数据类型包括:

2008-7-7 16:46

有关基本数据类型以及从MQI 类型到特定于编程语言的类型的映射的更多信息,请参见WebSphere MQ 文档库中的WebSphere MQ Application Programming Reference(请参见参考资料)。

MQI 中使用的结构

有些MQI 调用参数是包含多个数据字段的数据结构。所有结构都是按照基本数据类型来定义的。

最常用的结构包括:

2008-7-7 16:46

有关数据结构的更多信息,请参见WebSphere MQ 文档库中的WebSphere MQ Application Programming Reference(请参见参考资料)。

MQI 常量

WebSphere MQ 还定义了在MQI 编程中使用的常量。这些常量定义了MQI 调用中使用的输入和输出参数的有效值。这些符号常量在MQI 程序中得到广泛使用,并显著改进了那些程序的可读性。大多数常量名称都以一个前缀开头,用于标识其使用场合。例如,以MQRC_ 开头的常量定义原因代码,以MQOO_ 开头的常量定义打开选项。

受支持的编程语言

WebSphere MQ 提供了对大量编程语言的支持,包括C、C++、COBOL、.Net、PL/I、Assembler

和RPG。有些语言在多种平台上受支持;而诸如Assembler 和RPG 等语言则仅在一种平台上受支持(分别为System z 和System i)。诸如REXX 等其他编程语言支持则通过SupportPac 来提供。

构建WebSphere MQ 应用程序

由于有如此多的语言和编译器跨许多WebSphere MQ 平台受到支持,成功的编译和链接过程不仅在平台之间存在差异,而且在语言之间甚至在使用同一语言的不同编译器之间也存在差异。

程序员务必知道要使用哪个编译器,因为编译和链接可能是独特的。有关编译和链接WebSphere MQ 应用程序的详细信息,请参见WebSphere MQ 文档库中的WebSphere MQ Application Programming Guide(请参见参考资料)。

Java API

WebSphere MQ 提供了两个用于构建应用程序的Java API。

第一个是WebSphere MQ classes for Java,有时称为WebSphere MQ base Java。此API 紧密模仿MQI,但是由于Java 的面向对象性质而存在微妙的区别。例如,连接到队列管理器并不涉及到可容易地识别为MQCONN 调用的调用。相反,将创建一个MQQueueManager 实例。后续MQI 调用,例如通常传递将由MQCONN 返回的连接句柄的MQOPEN 或MQCLOSE,将改为使用MQQueueManager 实例上的方法来发出。

本教程中提供的示例程序使用WebSphere MQ classes for Java,您将在其中看到MQI 调用和参数如何映射到Java 方法和类。

第二个Java API 是WebSphere MQ classes for Java Message Service,也称为WebSphere MQ JMS。此API 提供了Java Message Service (JMS) 规范的一种实现。JMS 提供了用于访问任何企业消息系统的标准API,允许程序员集中于消息应用程序的业务逻辑,并隐藏了基础的实现细节。

当使用WebSphere MQ JMS 来与非JMS 的程序通信时,要注意WebSphere MQ JMS 消息在缺省情况下会携带一个附加标头,非JMS 程序可能无法处理该标头。当您知道是要将消息发送到非JMS 程序时,可以省略这个附加标头。

查看详细资料

TOP

在这里,您可以IBM 软件产品下载、Demo下载、试用版下载、红皮书下载、白皮书下载

阳春三月

版主

帖子141 积分1311 金钱1000 W币注册时间2008-7-7 个人空间发短消息加为好友当前离线3# 大中小发表于2008-7-7 16:52 只看该作者

WebSphere入门开窍班第6期:剪不断理还乱的Portal问题汇总| 谁是未来存储架构师?成就下一代信息架构| 《WebSphere中国》杂志免费领取

MQCONN

概述

在发出任何其他的MQI 调用之前,应用程序必须首先使用MQCONN 调用连接到队列管理器。应用程序所连接到的队列管理器是本地队列管理器。通常,您可以连接到特定的队列管理器或缺省的队列管理器。应用程序通常需要具有相应的权限以连接到队列管理器。

MQCONN 调用的语法如下:

复制内容到剪贴板代码:

MQCONN (QMgrName, Hconn, CompCode, Reason)

MQCONN 调用具有一个输入参数和三个输出参数,如下所示:

队列管理器名称——QMgrName(输入)应用程序希望连接到的队列管理器的名称。

连接句柄——Hconn(输出)连接句柄表示到队列管理器的连接,并且对该队列管理器进行的后续MQI 调用必须指定它作为参数。

完成代码——CompCode(输出)每个MQI 调用都会返回一个完成代码,以便应用程序可以快速地判断该次调用是成功完成、部分完成还是失败。

原因代码——Reason(输出)每个MQI 调用都会返回一个原因代码,以便在调用部分完成或失败的情况下,为应用程序提供更多的信息。

连接句柄

在连接时返回给应用程序的连接句柄将在所有后续MQI 调用上使用。应用程序一定不能更改它。有效的句柄是连接成功并且应用程序已被授权使用该队列管理器的指示。

MQCONN 完成和原因代码

所有调用都会产生三个原因代码之一:

2008-7-7 16:52

程序需要在每个调用后检查完成代码,如果出现警告或失败,程序需要检查原因代码,以确定程序是否应该继续。

在尝试MQCONN 调用时可能出现的一些最常见原因代码包括:

2008-7-7 16:52

不成功的MQCONN 尝试还可能会返回其他许多可能的原因代码。WebSphere MQ Application Programming Reference(请参见参考资料)中的MQCONN 调用描述包括了完整的原因代码列表。

在所有调用上,程序员都应该测试三类状态:

一切正常,未报告特殊条件(MQCC_OK 和MQRC_NONE)。

可能在各个调用上发生的预期特殊条件,它们特定于应用程序;例如,MQGET 上的MQRC_NO_MSG_AVAILABLE。

意外条件,例如MQCONNECT 或MQOPEN 上的MQRC_NOT_AUTHORIZED。

CICS 连接

CICS (z/OS) 程序不需要发出MQCONN 调用。CICS 会负责执行连接,因此不存在队列管理器选择。一个CICS 区域中只能有一个队列管理器。

虽然并不要求这样做,但是在CICS 程序中包括MQCONN 可能有助于您通过最少的重新编码来将应用程序移植到非CICS 环境。请注意,MQCONN 在CICS 环境中始终成功完成。

批处理连接

大型机环境中的批处理程序必须发出一个MQCONN 命令。但是与CICS 不同,批处理程序可以选择要连接到哪个队列管理器(如果已在系统上设置了多个队列管理器)。务必注意的是,一个批处理程序一般一次只能连接到一个队列管理器。这是大多数其他队列管理器所共有的行为类型。通过向批处理应用程序附加额外的任务控制块(TCB),可以同时连接到其他队列管理器。然而,WebSphere MQ 不会在TCB 之间协调同步点操作或资源共享。

IMS 连接

Information Management System (IMS) 提供了连接到多个队列管理器的特殊情况。IMS 程序可以同时连接到多个队列管理器。只要队列管理器对IMS 控制区域是已知的,运行于与IMS 无关的区域中的程序就能连接到该队列管理器,而不管程序是否已经连接到其他的队列管理器。

连接句柄的范围

连接句柄代表到队列管理器的连接。它将在应用程序与队列管理器交互时发出的所有后续调用上使用,直到发出MQDISC 调用时才不再有效。当定义连接句柄范围的处理单元终止时,连接句柄也不再有效。

连接句柄的范围仅限于所涉及环境中的最小并行处理单元。例如,UNIX、Linux 或Windows 上的某个线程、某个CICS 任务、某个IMS 任务(截止到同步点)、某个批处理任务或z/OS 下的某个TSO 任务。在该范围之外使用连接句柄无效。

连接到多个队列管理器

通常,应用程序一次只能连接到一个队列管理器。但是存在一些例外:

在z/OS 上,批处理、TSO 和IMS 允许多个并发连接。

在Windows 上,每个线程可以连接到不同的队列管理器。

客户端应用程序可以在一个线程中连接到多个队列管理器。

用于连接到多个队列管理器的规则在不同的受支持平台和环境之间是不同的,因此它是编写应用程序时的一个重要注意事项。如果存在将来希望移植应用程序的可能性,您需要考虑最受限制的环境,您将在其中针对该环境进行运行和设计。

访问控制

运行在特定用户ID 下的应用程序可能不允许连接到某个队列管理器。如果访问被拒绝(MQCC_FAILED 和MQRC_NOT_AUTHORIZED),则应用程序除了向WebSphere MQ 管理员报告问题外,其他什么事情也做不了。可能需要更改配置文件或访问控制列表。在任何情况下,都不会返回连接句柄,并且让应用程序继续运行是无意义的。

MQCONNX

尽管本教程的主题是MQI 中的主要调用,而MQCONNX 调用被视为次要调用,我们还是简要讨论一下它,因为它实际上只是MQCONN 的变体。

MQCONNX 调用是连接到某些平台上的队列管理器的另一种方法。除了在MQCONN 调用中传递的那些参数之外,它还提供了另一个参数。此附加参数称为连接选项。

MQCONNX 调用的语法如下:

复制内容到剪贴板代码:

MQCONNX (QMgrName, ConnectOpts, Hconn, CompCode, Reason)

连接选项的用途之一是控制程序连接的方式。当应用程序使用MQCONN 调用连接到队列管理器时,为每个后续MCI 调用提供服务而执行的队列管理器代码作为与该应用程序独立的执行单元运行。但是,当应用程序使用MQCONNX 调用连接到队列管理器时,它可以在调用中指定fastpath binding 选项。通过使用这个选项,为每个后续MCI 调用提供服务而执行的队列管理器代码与该应用程序运行于相同的执行单元中。这种安排方式的优点在于,运行应用程序仅需要更少的系统资源。其缺点是,队列管理器的完整性受到损害,因为无法保护其存储空间不会被覆盖。这种应用程序称为受信任的应用程序。

连接选项的另一种用途是客户端使用它来指定希望连接到的特定服务器,从而改写控制服务器连接的任何定义或其他设置。

MQCONNX 还允许您创建共享(与线程无关)的连接,可由某个进程中的所有线程使用。MQCONN 伪代码

下面的清单1 是使用MQCONN 的伪代码示例。我们将在本教程和下一个教程中使用伪代码,以提供与语言无关的代码用法和技术演示。虽然伪代码显然不是真实的编程语言,但是它允许我们看到代码结构和顺序,而不必束缚于某种特定的语言。

清单1. MQCONN 示例

复制内容到剪贴板代码:

DEFINE DEFAULT_QMGR AS CONSTANT ' '

DEFINE QMGR AS MQCHAR48

DEFINE CONN_HANDLE AS MQHCONN

DEFINE COMP_CODE AS MQLONG

DEFINE REASON_CODE AS MQLONG

QMGR = DEFAULT_QMGR

CALL MQCONN(QMGR,

CONN_HANDLE,

COMP_CODE,

REASON_CODE)

IF COMP_CODE NOT = MQCC_OK

write an error message detailing the REASON_CODE

terminate the program

STOP

END-IF

该代码首先将一个用于缺省队列管理器名称的常量定义为一个空字符串。在MQCONN 中为队列管理器名称传递空字符串将导致连接到系统上的缺省队列管理器。

然后是定义用于保存队列管理器名称、连接句柄、完成代码和原因代码的变量。

然后是将缺省队列管理器名称常量赋值给队列管理器名称变量,并发出MQCONN 调用。

调用完成后,该代码检查完成代码,如果完成代码不是MQCC_OK,则写入错误消息并终止程序。

查看详细资料

TOP

阳春三月

版主

帖子141 积分1311 金钱1000 W币注册时间2008-7-7 个人空间发短消息加为好友当前离线4# 大中小发表于2008-7-7 16:58 只看该作者

WebSphere入门开窍班第6期:剪不断理还乱的Portal问题汇总| 谁是未来存储架构师?成就下一代信息架构| 《WebSphere中国》杂志免费领取

MQOPEN

概述

在应用程序能够将消息放置到队列上或从队列获取消息之前,它必须首先通过发出MQOPEN 调用来打开队列。

MQOPEN 调用的语法如下:

复制内容到剪贴板代码:

MQOPEN (HConn, ObjDesc, Options, Hobj, CompCode, Reason)

MQOPEN 调用的有些参数在前面没有描述,它们分别是:

对象描述符——ObjDesc (输入/输出)MQI 中定义的结构之一。它的用途是标识打开的对象。它包含许多字段,其中有些字段可以指定所打开的对象的名称和对象的类型。

选项——Options(输入)由应用程序用于指定它希望在所打开的对象上执行哪些操作,或用于控制MQOPEN 的操作。示例包括打开队列以便放入消息,打开队列浏览消息,以及打开队列查询其部分或所有属性。通过将多个选项加在一起,或者通过使用按位OR 操作来组合它们,应用程序可以指定多个选项。

对象句柄——Hobj(输出)表示已建立的到对象的访问,并且必须在操作该对象的所有后续MQI 调用上将其指定为参数。

对象句柄

与从MQCONN 返回的连接句柄一样,对象句柄由MQOPEN 返回,并表示已建立的到该队

列的访问。在针对该队列的所有后续GET 和PUT 中都将使用该对象句柄。

一旦发生MQCLOSE,对象句柄就会失效。这允许程序员在后续MQOPEN 上重用该对象句柄;然后该对象句柄将仅与由最近的MQOPEN 打开的对象关联,并且仅用于该MQOPEN 期间请求的选项。

然而在大多数情况下,为每个所访问的队列维护单独的对象句柄会更容易。应用程序同时打开多个队列是很普遍的。在此情况下,程序员必须为每个队列设置单独的句柄,并在对队列执行PUT 或GET 时使用正确的句柄。

对象描述符

对象描述符(MQOD) 是应用程序用于标识所打开的对象(通常是队列)类型及其名称的结构。后续PUT 和GET 从不使用队列名称,而只使用对象句柄。

对象描述符中的有些字段可由应用程序初始化(在许多情况下可以使用缺省值),有些字段则作为MQOPEN 调用的结果进行更新并返回给应用程序。对象描述符中最常用的字段包括:

2008-7-7 16:58

WebSphere MQ Application Programming Reference 包含了对象描述符中所有字段的完整列表和描述(请参见参考资料)。

打开选项

打开选项是应用程序声明它对所打开对象的意图的方式。一些常用选项及其含义如下:

MQOPEN 原因代码

MQOPEN 返回的一些原因代码及其含义如下:

WebSphere MQ Application Programming Reference 描述了MQOPEN 能够返回的所有原因代码,并提供了建议的操作(请参见参考资料)。

MQOPEN 安全性

发出MQOPEN 时,用户或应用程序有可能无权打开对象,或者无权执行所请求的一个或多个选项。如果是这样,则MQOPEN 会失败,并返回原因代码MQRC_NOT_AUTHORIZED。WebSphere MQ 系统管理员将必须确保允许对该对象和所有适用选项的访问。

MQOPEN 伪代码

下面的清单2 提供了MQOPEN 调用的伪代码。

清单2. MQOPEN 示例

复制内容到剪贴板代码:

DEFINE DEFAULT_QMGR AS CONSTANT ' ' DEFINE QMGR AS MQCHAR48 DEFINE CONN_HANDLE AS MQHCONN DEFINE COMP_CODE AS MQLONG DEFINE REASON_CODE AS MQLONG DEFINE OBJ_DESC AS MQOD DEFINE MYQUEUE_HANDLE AS MQHOBJ DEFINE OPEN_OPTIONS AS MQLONG QMGR = DEFAULT_QMGR CALL MQCONN(QMGR, CONN_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF OBJ_DESC.ObjectType = MQOT_Q OBJ_DESC.ObjectName = 'MYQUEUE' OBJ_DESC.ObjectQMgrName = DEFAULT_QMGR OPEN_OPTIONS = MQOO_OUTPUT + MQ00_FAIL_IF_QUIESCING CALL MQOPEN(CONN_HANDLE, OBJ_DESC, OPEN_OPTIONS, MYQUEUE_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF

此代码基于清单 1 中的MQCONN 示例。请注意其中定义用于MQOPEN 调用的附加变量(OBJ_DESC、MYQUEUE_HANDLE 和OPEN_OPTIONS)。还要注意对象描述符的初始化和打开选项变量。通过将适当的符号常量加在一起,可以指定多个打开选项。

与MQCONN 调用类似,在MQOPEN 调用完成后检查完成代码,并在调用不成功时采取适

当的操作。

查看详细资料

TOP

在这里,您可以IBM 软件产品下载、Demo下载、试用版下载、红皮书下载、白皮书下载

阳春三月

版主

帖子141 积分1311 金钱1000 W币注册时间2008-7-7 个人空间发短消息加为好友当前离线5# 大中小发表于2008-7-7 17:03 只看该作者

WebSphere入门开窍班第6期:剪不断理还乱的Portal问题汇总| 谁是未来存储架构师?成就下一代信息架构| 《WebSphere中国》杂志免费领取

MQCLOSE 和MQDISC

MQCLOSE

MQCLOSE 调用可停止对某个对象的访问。

MQCLOSE 调用的语法如下:

复制内容到剪贴板代码:

MQCLOSE (HConn, Hobj, Options, CompCode, Reason)

MQCLOSE 调用中的连接句柄和对象句柄就是由MQOPEN 调用所返回的那些句柄。可设置的选项包括:

MQCLOSE 原因代码

尽管程序可能完成了对对象的使用,但是未能正确关闭对象可能指示了某个涉及面更广的问题。因此,应该报告所有原因代码并进行正确的处理。可从MQCLOSE 返回的一些原因代码包括:

MQCLOSE 伪代码

下面的清单3 提供了MQCLOSE 调用的伪代码。与前面一样,此代码基于前一清单中的代码来提供上下文。

清单3. MQCLOSE 示例

复制内容到剪贴板代码:

DEFINE DEFAULT_QMGR AS CONSTANT ' ' DEFINE QMGR AS MQCHAR48 DEFINE CONN_HANDLE AS MQHCONN DEFINE COMP_CODE AS MQLONG DEFINE REASON_CODE AS MQLONG DEFINE OBJ_DESC AS MQOD DEFINE MYQUEUE_HANDLE AS MQHOBJ DEFINE OPEN_OPTIONS AS MQLONG DEFINE CLOSE_OPTIONS AS MQLONG QMGR = DEFAULT_QMGR CALL MQCONN(QMGR, CONN_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF OBJ_DESC.ObjectType = MQOT_Q OBJ_DESC.ObjectName = 'MYQUEUE' OBJ_DESC.ObjectQMgrName = DEFAULT_QMGR OPEN_OPTIONS = MQOO_OUTPUT + MQ00_FAIL_IF_QUIESCING CALL MQOPEN(CONN_HANDLE, OBJ_DESC, OPEN_OPTIONS, MYQUEUE_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF CLOSE_OPTIONS = MQCO_NONE CALL MQCLOSE(CONN_HANDLE, MYQUEUE_HANDLE, CLOSE_OPTIONS, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF

请注意定义用来包含关闭选项的变量和该变量紧跟在MQCLOSE 调用前的设置。MQDISC

一旦程序结束对队列管理器及其资源的使用,它就应该使用MQDISC 来断开与队列管理器的连接。

MQDISC 调用的语法如下:

复制内容到剪贴板代码:

MQDISC (HConn, CompCode, Reason)

MQDISC 是一个简单调用,只有非常少的参数,并且没有选项。在大多数情况下,成功的MQDISC 调用的结果是连接句柄失效。

MQDISC 原因代码

尽管失败的MQDISC 对于断开连接的应用程序似乎并不重要,但是务必要检查和报告任何意外的结果。MQDISC 可能返回的一些原因代码包括:

MQDISC 伪代码

下面的清单4 提供了MQDISC 调用的伪代码,并且建立在前一清单的基础上。

清单4. MQDISC 示例

复制内容到剪贴板代码:

DEFINE DEFAULT_QMGR AS CONSTANT ' ' DEFINE QMGR AS MQCHAR48 DEFINE CONN_HANDLE AS MQHCONN DEFINE COMP_CODE AS MQLONG DEFINE REASON_CODE AS MQLONG DEFINE OBJ_DESC AS MQOD DEFINE MYQUEUE_HANDLE AS MQHOBJ DEFINE OPEN_OPTIONS AS MQLONG DEFINE CLOSE_OPTIONS AS MQLONG QMGR = DEFAULT_QMGR CALL MQCONN(QMGR, CONN_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF OBJ_DESC.ObjectType = MQOT_Q OBJ_DESC.ObjectName = 'MYQUEUE' OBJ_DESC.ObjectQMgrName = DEFAULT_QMGR OPEN_OPTIONS = MQOO_OUTPUT + MQ00_FAIL_IF_QUIESCING CALL MQOPEN(CONN_HANDLE, OBJ_DESC, OPEN_OPTIONS, MYQUEUE_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF CLOSE_OPTIONS = MQCO_NONE CALL MQCLOSE(CONN_HANDLE, MYQUEUE_HANDLE, CLOSE_OPTIONS, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF CALL MQDISC(CONN_HANDLE, COMP_CODE, REASON_CODE) IF COMP_CODE NOT = MQCC_OK write an error message detailing the REASON_CODE terminate the program STOP END-IF

查看详细资料

TOP

阳春三月

版主

帖子141 积分1311 金钱1000 W币注册时间2008-7-7 个人空间发短消息加为好友当前离线6# 大中小发表于2008-7-7 17:09 只看该作者

WebSphere入门开窍班第6期:剪不断理还乱的Portal问题汇总| 谁是未来存储架构师?成就下一代信息架构| 《WebSphere中国》杂志免费领取

MQPUT

概述

MQPUT 用于将消息放到已打开用于输出的队列上。

MQPUT 调用的语法如下:

复制内容到剪贴板代码:

MQPUT (Hconn, Hobj, MsgDesc, PutMsgOpts,

BufferLength, Buffer, CompCode, Reason)

可以看到,在这个调用上传递的参数数量大于常规事务调用(MQCONN、MQOPEN、MQCLOSE、MQDISC)的参数数量。其中有些参数应该是很熟悉的,例如Hconn、Hobj、CompCode 和Reason,因为常规事务调用中已使用过它们。

Buffer 和BufferLength 参数分别包含应用程序数据(消息)和应用程序数据的长度。

下面讨论消息描述符(MsgDesc) 和放置消息选项(PutMsgOpts)。

消息描述符

消息描述符(MQMD 结构)封装了消息的属性。它可由应用程序或由队列管理器更新。在许多情况下,应用程序允许队列管理器在发出MQPUT 时简单地提供缺省值(例如取自队列定义)。

消息描述符中的一些更重要字段包括:

放置消息选项

放置消息选项(MQPMO 结构)控制如何将消息放置到队列上。放置消息选项的一些字段如下:

MQPUT 原因代码

MQPUT 返回的一些原因代码如下:

MQPUT 伪代码

下面的清单5 包含了MQPUT 调用的伪代码。

清单5. MQPUT 示例

复制内容到剪贴板代码:

DEFINE DEFAULT_QMGR AS CONSTANT ' '

DEFINE QMGR AS MQCHAR48

DEFINE CONN_HANDLE AS MQHCONN

DEFINE COMP_CODE AS MQLONG

DEFINE REASON_CODE AS MQLONG

DEFINE OBJ_DESC AS MQOD

DEFINE MYQUEUE_HANDLE AS MQHOBJ DEFINE OPEN_OPTIONS AS MQLONG

DEFINE CLOSE_OPTIONS AS MQLONG

DEFINE MESSAGE_DESCRIPTOR AS MQMD DEFINE PUT_OPTIONS AS MQPMO

DEFINE MESSAGE_LENGTH AS MQLONG DEFINE MESSAGE AS CHAR100

QMGR = DEFAULT_QMGR

CALL MQCONN(QMGR,

CONN_HANDLE,

COMP_CODE,

REASON_CODE)

IF COMP_CODE NOT = MQCC_OK

write an error message detailing the REASON_CODE

terminate the program

STOP

END-IF

OBJ_DESC.ObjectType = MQOT_Q

OBJ_DESC.ObjectName = 'MYQUEUE'

OBJ_DESC.ObjectQMgrName = DEFAULT_QMGR

OPEN_OPTIONS = MQOO_OUTPUT + MQ00_FAIL_IF_QUIESCING

CALL MQOPEN(CONN_HANDLE,

OBJ_DESC,

OPEN_OPTIONS,

MYQUEUE_HANDLE,

COMP_CODE,

REASON_CODE)

IF COMP_CODE NOT = MQCC_OK

write an error message detailing the REASON_CODE

terminate the program

STOP

END-IF

MESSAGE_LENGTH = 11

MESSAGE = 'Hello World'

CALL MQPUT(CONN_HANDLE,

MYQUEUE_HANDLE,

MESSAGE_DESCRIPTOR,

PUT_OPTIONS,

MESSAGE_LENGTH,

MESSAGE,

COMP_CODE,

REASON)

IF COMP_CODE NOT = MQCC_OK

write an error message detailing the REASON_CODE

terminate the program

STOP

END-IF

CLOSE_OPTIONS = MQCO_NONE

CALL MQCLOSE(CONN_HANDLE,

MYQUEUE_HANDLE,

CLOSE_OPTIONS,

COMP_CODE,

REASON_CODE)

IF COMP_CODE NOT = MQCC_OK

write an error message detailing the REASON_CODE

terminate the program

STOP

END-IF

CALL MQDISC(CONN_HANDLE,

COMP_CODE,

REASON_CODE)

IF COMP_CODE NOT = MQCC_OK

write an error message detailing the REASON_CODE

terminate the program

STOP

END-IF

请注意为MQPUT 调用定义的变量(MESSAGE_DESCRIPTOR、PUT_OPTIONS、MESSAGE_LENGTH 和MESSAGE)。该伪代码没有设置消息描述符的任何字段,也没有设置放置消息选项,而是接受那些结构的缺省值。

查看详细资料

TOP

在这里,您可以IBM 软件产品下载、Demo下载、试用版下载、红皮书下载、白皮书下载

阳春三月

版主

帖子141 积分1311 金钱1000 W币注册时间2008-7-7 个人空间发短消息加为好友当

前离线7# 大中小发表于2008-7-7 17:20 只看该作者

WebSphere入门开窍班第6期:剪不断理还乱的Portal问题汇总| 谁是未来存储架构师?成就下一代信息架构| 《WebSphere中国》杂志免费领取

消息创建示例代码

清单5 提供了一个完整(尽管不是相当有用)程序的伪代码。它连接到一个队列管理器,打开一个队列,在该队列上放置一个消息,然后关闭该队列,并断开与队列管理器的连接。在本部分中,您将研究一些用Java 编写的实际代码,并运行该代码以查看其实际工作情况。

在继续之前,您需要安装IBM Rational Application Developer v6.0 (Application Developer)。请参见参考资料以获得指向Application Developer 试用版的链接。在下载试用版时,您只需下载标记为必需的文件;您不需要任何标记为可选的文件。在安装Application Developer 时接受所有缺省设置。

下载示例代码

将包含示例代码和配置文件的.zip 文件wes-cert9964samples.zip 下载到系统上(请参见samples02.zip (9.97 KB) samples02.zip (9.97 KB)

下载次数: 1

2008-8-27 16:20下载)。将该文件的内容提取到系统上的某个文件夹中。提取之后,您将拥有四个文件:MQMajor.zip、setup01.txt、setup02.txt 和setup03.txt。

将三个设置文件复制到您的用户目录,即打开命令提示符时的缺省目录。通常,该目录为\Documents and Settings\Administrator or \Documents and Settings\

导入示例代码

若要将示例代码导入Application Developer:

1.从“开始”菜单中启动Application Developer。

2.在提示选择工作区时接受缺省工作区,然后单击OK。

3.从主菜单中,单击Window >Open Perspective > Java。

4.从主菜单中选择File > Import...。

5.选择Project Interchange 并单击Next。您的屏幕应该与图1 类似。您系统上的Project location root: 字段可能不同;这没有问题。

图1. Import Project Interchange Contents

人物语言描写教案

第一课:人物语言描写训练 教学目标:1、培养学生能有意识地运用语言描写把人物和事件写得生动形象; 2、初步让学生了解和学会运用语言描写的方法技巧。 教学重点:通过赏析和修改等方法了解如何进行语言描写。 教学难点:通过看图写作初步掌握人物的语言描写。 教学过程: 一、导入: 初中阶段,咱们的写作任务主要是写好规范的记叙文。一篇好的记叙文往往要具备这样几个方面的特点:真——要写出真情实感;细——要有具体可感的描写;活——要能巧妙地运用选材、表达、布局谋篇、立意等多方面的写法技巧,写出新意。有人说,练好记叙文的真功夫还得在“细”字上多斟酌,那么,这节课,咱们就来探究一下“如何写好作文中的说”。 二、品一品,明作用: (一)、比较下面三组句子中的A句和B句的表达效果,归纳语言描写概念及其作用: 1、A. 双喜问阿发偷谁家的,阿发说偷他家的。 B. “阿阿,阿发,这边是你家的,这边是老六一家的,我们偷哪一边的呢?”双喜说。“且慢,让我来看看吧。……偷我们的吧,我们的大得多呢!”——《社戏》 2、A.哈尔威船长不准男人走在女人前面。 B.哈尔威船长说:“哪个男人胆敢走在女人前面,你就开枪打死他。”——《船长》 3、A.老大臣认为这布料很美,他很满意。 B.“哎呀,美极了!真是美妙极了!”老大臣一边说一边从他的眼镜里仔细地看,“多么美的花纹!多么美的色彩!是的,我将要呈报皇上,我对这布料非常满意。”——《皇帝的新装》归纳—— 语言描写:就是对人物的独白、对话及其说话时的神态、动作、语气等的描写,其主要作用是刻画人物性格。 语言描写妙处:语言描写的主要作用是刻画人物性格,运用恰当的语言描写能使文章逼真、传神、生动、形象,使读者如见其人,如闻其声,如临其境,更好地表现人物性格,揭示文章中心。 (二)简单介绍按照参与话语活动的人数,语言描写的三种类型: 1、“唉,这鬼天气!又闷又热,蚊子也来捣乱,一夜没睡,真倒霉!”王老五不停地边拍着蒲扇边咒骂着。(独白) 2、“你去哪儿?”“图书馆。” “借书吗?”“不,还书。”(对话) 3、马克说:“我们去上海吧。”玛丽说:“上海没什么传统的东西,还是去西安吧。”罗兰一听又不同意了,急忙说:“我喜欢自然风景,听说中国的西部自然风光很好,我们去那里旅行吧。”爱德华听了他们的话,很为难地说:“你们每个人的想法都不同,我们到底去哪里好呢?”(多人议谈) 三、想一想,知方法——以具体示例,通过比较、分析、修改法让 学生了解归纳作文中进行语言描写的方法 (一)方法一、根据语境灵活运用表示“说”的词,如:叫、喊、问、数、应、道等等 A、“来呀!”我最好的朋友杰利对我叫喊,“别做胆小鬼。”

第三讲 数据类型

第三讲数据类型 教学要求: 1.了解值类型和引用类型的区别 2.掌握数据类型转换的几种情况 教学学时: 2H 一.数据类型的分类 在C#中提供的数据类型有两大类:值类型和引用类型。 值类型直接存储数据,不可以为空,也不可以派生出新的类型,包括整型、实型、布尔型、字符型、结构型和枚举型,值类型数据在栈中存储。 static void Main(string[] args) { int x, y; x = 5; y = x; x=10; Console.WriteLine("x={0},y={1}", x, y); y = 20; Console.WriteLine("x={0},y={1}", x, y); Console.ReadKey(); } 引用类型存储对实际数据的引用(地址),引用类型分两步创建: 首先在栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的地址赋给引用变量。 C#有两个内置的引用类型:object类型和string类型。 object类型的变量可以引用任何类型的数据。 string类型的变量只可以引用字符串。 static void Main(string[] args) { string s1 = "agagssa"; string s2 = null; Console.WriteLine("s1={0},s2={1}", s1, s2); s2 = s1; s1 = "512512"; Console.WriteLine("s1={0},s2={1}", s1, s2);

Console.ReadKey(); } 补充知识(内存中的栈与堆的区别) 栈只能由系统自动分配,堆可以由程序员自主申请分配。 栈的空间较小(1M或2M),堆的空间较大(受限于系统有效虚拟内存)。 栈的访问速度快,堆的访问速度慢。 栈的使用不会产生碎片,而堆的使用会产生碎片。 对于使用用户自定义的类或系统定义的类用new关键字来创建一个新的对象时,过程也是这样的。 class Student { public int ID; public string Name; } class Program { static void Main(string[] args) { Student x = new Student(); x.ID = 5; https://www.sodocs.net/doc/272407155.html, = "wang"; Student y; y = x; y.ID = 10; https://www.sodocs.net/doc/272407155.html, = "cheng"; Console.WriteLine("x.ID={0},https://www.sodocs.net/doc/272407155.html,={1}", x.ID, https://www.sodocs.net/doc/272407155.html,); Console.WriteLine("y.ID={0},https://www.sodocs.net/doc/272407155.html,={1}", y.ID, https://www.sodocs.net/doc/272407155.html,); Console.ReadKey(); } } 二.值类型的数据与object类型数据之间的赋值类型转换 1. 将值类型的数据赋值给object类型变量时能自动完成将值类型的数据转换为object类型数据。 int x = 123; object obj1 = x; //相当于object obj1 = (object) x; x = x + 100; Console.WriteLine("x={0}", x); Console.WriteLine ("obj1={0}",obj1); Console.Read(); 输出结果: x=223 obj1=123 说明:

大学生创业导论期末答案

大学生创业导论 By江上一小白 一、单选题(题数:30,共30分) 1 创业计划书,可以看做是()。(1.0分) ?A、 一个创业主题的“灵魂” ?B、 金钥匙 ?C、 功能超强的“电脑” ?D、 以上都对 正确答案:D 2毕业当年的普通高等学校毕业生持有三证初次申办个体工商户营业执照从事国家()行业外个体经营的可以享受优惠。(1.0分) ?A、 限制行业 ?B、 娱乐行业 ?C、 体育行业 ?D、 教育行业 正确答案:A 3 关于创业团队中协调者的描述,正确的是()。(1.0分) ?A、

解决难题,富有创造力和想象力 ?B、 外向、热情、健谈 ?C、 成熟、自信,是称职的主事人 ?D、 冷静,有战略眼光与识别力 正确答案:C 4 企业在成长中会受到很多资源的限制,以下不属于成长资源限制的是()。(1.0分) ?A、 管理能力的制约 ?B、 市场容量的限制 ?C、 资金的约束 ?D、 人力资源的缺乏 正确答案:D 5 SWOT战略中利用优势挑战威胁的是()战略。(1.0分) ?A、 S—O ?B、 W—O ?C、 W—T ?D、

S—T 正确答案:D 6 浓缩了创业书的精华是()。(1.0分) ?A、 企业介绍 ?B、 行业分析 ?C、 计划摘要 正确答案:C 7 “看清最终目标并坚定方向”是指中国创业者身上的素质()。(1.0分)?A、 适应力 ?B、 视野 ?C、 毅力 ?D、 执行力 正确答案:B 8 创业计划书内容中,人员及组织结构之后的一步应该是()。(1.0分)?A、 营销策略 ?B、 产品,服务,介绍 ?C、 市场预测

财务规划 正确答案:C 9 “加强优秀创业人物及其创业事迹的宣传”是创业中对()的建议。(1.0分)?A、 学校 ?B、 社会 ?C、 政府 ?D、 学生 正确答案:B 10 在创业项目选择之前,应该()。(1.0分) ?A、 要先定创业行业领域 ?B、 产业分类要了解 ?C、 创业的项目不违反社会公德 ?D、 以上都是 正确答案:D 11 创新思维修炼的方法中有一种方法是:禁止对任何方案有批评,每个人都可以提出自己的意见,主要来解决问题的方法是()。(1.0分) ?A、 头脑风暴法

Java 基本数据类型取值范围讲解

Java 基本数据类型取值范围讲解 一、Java的类型词语理解: 1) 原始数据类型,简单类型,基本类型都是一个含义; 2)复合类型,扩展类型,复杂类型、引用类型都是一个含义; 3)浮点类型,实数、实型都是一个含义; 4)逻辑型、布尔型都是一个含义; 5)本人个人认同的类型分类: 阅读时需要理解: 定点:定点的意思是把小数点定在末尾,小数点后没有数字的数据,Java中通常把它们称为整数; 常量:就是直接的值; 变量:放置常量的容器,除了放置常量之外,也可以给变量一个运算式,变量中的值是可变的; 二、Java数据类型基本概念: 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范会相对严格。数据类型是语言的抽象

原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上讲将数据类型分为两种:基本类型和引用数据类型。 基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。 引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。 三、Java中的数据类型与内存的关系 在Java中,每个存放数据的变量都是有类型的,如: char ch;float x;inta,b,c; ch是字符型的,就会分配到2个字节内存。不同类型的变量在内存中分配的字节数不同,同时存储方式也 是不同的。 所以给变量赋值前需要先确定变量的类型,确定了变量的类型,即确定了数据需分配内存空间的大小,数 据在内存的存储方式。 四、Java数据类型在内存中的存储: 1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内 存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型; 2)引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存 模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储 在有序的内存栈上的,而对象本身的值存储在内存堆上的; 区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的(需要java中的栈、堆概念), 基本类型和引用类型的内存模型本质上是不一样的。 例1:我们分析一下”==“和equals()的区别。 首先,我定以两个String对象 String a="abc";

c#总复习题

一.选择题: 1. C#语言源代码文件的后缀名为______________. A .C# B .C C C .CSP D .CS AN: D 2. 构建桌面应用程序需要.NET提供的类库是_____________. A https://www.sodocs.net/doc/272407155.html, B Windows.Form C XML D https://www.sodocs.net/doc/272407155.html, AN: B 3. 与C++等语言相比,C#中增加的一个类成员访问修饰符是___________. A private B public C protected D internal AN: D 4. C#中程序的入口方法名是____________________. A Main B. main C Begin D using AN: A 5. 关于C#语言的基本语法,下列哪些说法是正确的? A. C#语言使用using 关键字来引用.NET 预定义的名字空间; B. 用C#编写的程序中,Main 函数是唯一允许的全局函数; C. C#语言中使用的名称不区分大小写; D. C#中一条语句必须写在一行内; AN: A 6.在C#中,表示一个字符串的变量应使用以下哪条语句定义? A. CString str; B. string str; C. Dim str as string D. char * str; AN:B 7.C#中的值类型包括三种,它们是____。 A.整型、浮点型、基本类型 B.数值类型、字符类型、字符串类型 C.简单类型、枚举类型、结构类型D.数值类型、字符类型、枚举类型 AN:C 8.枚举类型是一组命名的常量集合,所有整型都可以作为枚举类型的基本类型,如果类型省略,见约定为______。 A.int B.sbyte C.uint D.ulong AN:A 9.C#的引用类型包括类、接口、数组、委托、object和string。其中object______________根类。A.只是引用类型的B.只是值类型的 C.只是string类型的D.是所有值类型和引用类型的 AN:D 10.浮点常量有三种格式,下面_____________组的浮点常量都属于double类型。 A.0.618034,0.618034D, 6.18034E-1

创业类型的主要分类

创业类型的主要分类 1、离职创立新公司,新公司与原来任职公司属于不同行业性质,新公司也必须立即面对激烈的市场竞争。 2、新公司由原行业精英人才组成,企图以最佳团队组合,集合众家之长,来发挥竞争优势。 3、创业者运用原有的专业技术与顾客关系创立新公司,并且能够提供比原公司更好的服务。 4、接手一家营运中的小公司,快速实现个人创业梦想。 5、创业者拥有专业技术,能预先察觉未来市场变迁与顾客需求的新趋势,因而决定掌握机会,创立新公司。 6、为提供特殊市场顾客更好的产品与服务而离职创立新公司,机关报公司具有服务特殊市场的专业能力与竞争优势。 7、创业者为实现新企业理想,在一个刚萌芽的新市场中从事创新,企图获得领先创新的竞争优势,但相对的不确定性风险也比较高。 8、离职创立新公司,产品或服务和原有公司相似,但是在流程与营销上有所创新,能为顾客提供更满意的产品与服务。 以上主要是创业者的开始方式,就过程来看,根据创业者对市场的不同认识,人们多会采用下面的四种创业模式。 1、复制型创业: 复制原有公司的经营模式,创新的成分很低。例如某人原本在餐厅里担任厨师,后来离职自行创立一家与原服务餐厅类似的新餐厅。新创公司中属于复制型创业的比率虽然很高,但由于这类型创业的创新贡献太低,缺乏创业精神的内涵,不是创业管理主要研究的对象。这种类型的创业基本上只能称为“如何开办新公司”,因此很少会被列入创业管理课程中学习的对象。

2、模仿型创业: 这种形式的创业,对于市场虽然也无法带来新价值的创造,创新的成分也很低,但与复制型创业的不同之处在于,创业过程对于创业者而言还是具有很大的冒险成分。例如某一纺织公司的经理辞掉工作,开设一家当下流行的网络咖啡店。这种形式的创业具有较高的不确定性,学习过程长,犯错机会多,代价也较高昂。这种创业者如果具有适合的创业人格特性,经过系统的创业管理培训,掌握正确的市场进入时机,还是有很大机会可以获得成功。 3、安定型创业: 这种型式的创业,虽然为市场创造了新的价值,但对创业者而言,本身并没有面临太大的改变,做的也是比较熟悉的工作。这种创业类型强调的是创业精神的实现,也就是创新的活动,而不是新组织的创造,企业内部创业即属于这一类型。例如研发单位的某小组在开发完成一项新产品后,继续在该企业部门开发另一项新品。 4、冒险型创业: 这种类型的创业,除了对创业者本身带来极大改变,个人前途的不确定性也很高;对新企业的产品创新活动而言,也将面临很高的失败风险。冒险型创业是一种难度很高的创业类型,有效高的失败率,但成功所得的报酬也很惊人。这种类型的创业如果想要获得成功,必须在创业者能力、创业时机、创业精神发挥、创业策略研究拟定、经营模式设计、创业过程管理等各方面,都有有很好的搭配。 想去创业,就必须先要深入的了解创业,通过调查与学习,人们才能拥有自己的经验,才能为以后的创业工作铺平道路。了解创业的类型,为自己选择一条合适的出路,也就是为自己选择一个适合的生活。

语言描写的技巧

语言描写的技巧 -----作文写作指导语言描写的种类: (1)直接描写。把人物的语言直接具体地写出来叫直接描写,它常用的方式是对话,另外还有独白等。独白指没有对方只有人物自己的讲话。 (2)间接描写。为了叙述简洁、紧凑,作者只传达人物讲话重点,用叙述的方法写人物的语言叫间接描写。 一、怎样写好人物的语言呢?让我们先来读读下面几段话: ⒈妈妈俯下身子,轻声对我说:“刚盛的饭菜很烫,小心点儿,别烫着手,啊!” ⒉“不!我要!我要!我就要!”表妹跺着脚大叫起来。 ⒊“真对不起,失陪了。”李叔叔神情焦急地对我们说,“刚才医院里来了个急诊病人,我得马上去处理一下。” ⒋“你这老头子,又要疯。这像啥样?叫外人笑话。” 读了这几段话,你是否领悟到了语言描写的方法?下面老师教你几招: 绝招一:什么人说什么话 俗话说:“什么树开什么花,什么人说什么话。”人物的年龄、身份、性格不同,他们说话的特点也就不同。比如从第4段话中,我们可以猜出说话的人是位老奶奶。所以,语言描写时要做到写谁像谁,把人物的特点写出来。 绝招二:小小话语见精神 写好人物的语言,可以生动形象地展现人物的精神面貌。比如从第3段话中,我们能够看出李叔叔一定是个优秀的医生,他急病人所急,想病人所想。我们作文时就要注意写好能够表现人物思想品质的话语,让“语言”说话。 绝招三:描写宜短不宜长 许多同学描写人物语言时,总喜欢让人物说大段大段的话。这样一来,文章就显得不够简练。我们要学会对人物的语言进行加工,选择重点的话语来写,而且写起来的句子最好不要太长。 绝招四:灵活变化好处多 一个人说话时,总要出现相应的表情与动作,把它们描写出来,可以增强表达效果。另外,为了使描写更加生动活泼,可以灵活使用不同的表达形式,如提示语在前,提示语在后,还可以把提示语放在人物说的话中间。当然,如果读者能从人物的语言中体会到是谁说的话,也可以把提示语省略。 下面是某一学生的语言描写。 门被打坏了,开了一个拳头大的窟窿。 班主任来了,说“谁踢坏的?”

系统功能调用实验

西安电子科技大学 计算机学院 实 验 报 告 题目:Linux 系统调用的实现 班级: 姓名: 学号:

一、理论分析 1.系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。系统调用的存在,有以下重要的意义:用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,从而大大简化了用户程序的开发。比如:用户程序通过write()系统调用就可以将数据写入文件,而不必关心文件是在磁盘上还是软盘上,或者其他存储上;系统调用使得用户程序有更好的可移植性。只要操作系统提供的系统调用接口相同,用户程序就可在不用修改的情况下,从一个系统迁移到另一个操作系统;系统调用使得内核能更好的管理用户程序,增强了系统的稳定性。因为系统调用是内核实现的,内核通过系统调用来控制开放什么功能及什么权限给用户程序。这样可以避免用户程序不正确的使用硬件设备,从而造成破坏;系统调用有效的分离了用户程序和内核的开发。用户程序只需关心系统调用API,通过这些 API 来开发自己的应用,不用关心 API 的具体实现。内核则只要关心系统调用 API 的实现,而不必管它们是被如何调用的。简言之,用户程序,系统调用,内核,硬件设备的调用关系如下图: 2.Linux 系统调用基本原理:对于 Linux 系统调用的理解我们需要清楚以下两点: l 系统调用的函数名称转换; l 系统调用的参数传递。首先看第一个问题。实际上,Linux 中

每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表 sys_call_table,表中的元素是系统调用函数的起始地址,而系统调用号就是系统调用在调用表的偏移量。在 x86 上,系统调用号是通过 eax 寄存器传递给内核的。通知内核的机制靠软件中断实现。首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号。参数设置完成后,程序执行“系统调用”指令。x86 系统上的软中断由 int 0x80 产生。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器切换到内核态并跳转到一个新的地址,并开始执行那里的异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。它与硬件体系结构紧密相关。新地址的指令会保存程序的状态,计算出应该调用哪个系统调用,调用内核中实现那个系统调用的函数。从系统分析的角度,Linux 的系统调用涉及 3 个方面的问题。(1)响应函数 sys_xxx 响应函数名以“sys_”开头,后跟该系统调用的名字。例如:系统调用 fork()的响应函数是 sys_fork()。 (2)系统调用表与系统调用号:数组与下标文件 include/asm/unisted.h 为每个系统调用规定了唯一的编号。系统调用表 sys_call_table 记录了各 sys_name 函数在表中的位置。有了这张表,就很容易根据特定系统调用在表中的偏移量,找到对应的系统调用响应函数的入口地址。系统调用号相当关键,一旦分配就不能再有任何变更,否则编译好的应用程序就会崩溃。Linux 有一个“未实现”系统调用 sys_ni_syscall(),它除了返回 ENOSYS 外不做任何其他工作,这个错误号就是专门针对无效的系统调用而设的。(3)int 0x80 中断过程宏定义_syscallN()(见 include/asm/unisted.h)用于系统调用的格式转换和参数的传递。N 取 0~5 之间的整数。参数个数为 N 的系统调用由_syscallN()负责格式转换和参数传递。系统调用号放入 eax 寄存器,启动 int 0x80 后,规定返回值送 eax 寄存器。

2014-2015-1C#复习题

2014-2015-1《C#桌面程序应用开发》复习题 一、选择题 1、装箱是把值类型转换到( b )类型。 a)数组b)引用c)char d)string 2、下列哪个类型的对象是https://www.sodocs.net/doc/272407155.html,在非连接模式下处理数据内容的主要对象?(d ) a) Command b) Connection c) DataAdapter d) DataSet 3、枚举类型是一组命名的常量集合,所有整型都可以作为枚举类型的基本类型,如果类型 省略,则定义为( a )。 a) int b) sbyte c) uint d) ulong 4、面向对象编程中的“继承”的概念是指( b ) a) 对象之间通过消息进行交互b)派生自同一个基类的不同类的对象具有一些共同特征c)对象的内部细节被隐藏d) 派生类对象可以不受限制地访问所有的基类对象5、在C#的类结构中,class关键字前面的关键字是表示访问级别,下面哪个关键字表示该类只能被这个类的成员或派生类成员访问? ( d )。 a) public b) private c) internal d) protected 6、下列类型中, 哪些不属于引用类型?( b )。 a) String b) int c) Class d) Delegate 7、数组pins的定义如下: int[] pins=new int[4]{9,2,3,1}; 则pins[1]=( b ) a) 1 b) 2 c) 3 d) 9 8、创建数据库连接使用的对象是( a )。 a) Connection b) Command c) DataReader d) DataSet 9、调用方法时,如果想给方法传递任意个数的参数时,应选用哪个关键字( c )。 a) ref b) out c) params d) 无特殊要求 10、C#中TestClass为一自定义类,其中有以下属性定义 public void Property{…}开卷考 使用以下语句创建了该类的对象,并使变量obj引用该对象: TestClass obj = new TestClass(); 那么,可通过什么方式访问类TestClass的Property属性?( a ) a) Obj,Property; b) MyClass.Property; c) obj :: Property; d) obj.Property (); 11、下列关于C#面向对象应用的描述中,哪项是正确的?( c )。 a) 派生类是基类的扩展,派生类可以添加新的成员,也可去掉已经继承的成员 b) abstract方法的声明必须同时实现 c) 声明为sealed的类不能被继承 d)接口像类一样,可以定义并实现方法 12、C#中导入某一命名空间的关键字是( a )。 a) using b) use c)import d) include 13、一般情况下,异常类存放在什么命名空间中?( b )。 a) 生成异常类所在的命名空间b) System.Exception命名空间 c) System.Diagnostics命名空间d) System命名空间 14、若将数据库中的数据填充到数据集,应调用SqlDataAdapter的(c )方法。

系统功能介绍

1 系统功能描述 下面描述系统各个功能的使用方法: 首先在IE地址栏中输如系统网址(http://192.168.0.142:8080/TrainDesign/),进入高速列车综合设计方法体系及流程软件系统的欢迎界面,如图1所示。 图 1 系统首页 在图示位置按提示要求输入账号和密码,点击确认,进入系统主界面(见图2)。 图 2 系统主界面 系统菜单如图所示,分为用户、部件资源、理论文档、设计资源、其他和帮

助。现就各个菜单功能依次进行介绍。 1.1 用户菜单 此菜单主要是针对本系统的使用者,对用户的角色,所属部门和权力进行设置,包括部门管理、用户管理、角色管理和用户信息几部分。点击“用户”,如图3 图 3 用户菜单 1.1.1部门管理 部门管理:增加,修改,删除用户所属部门,并选择所在部门使用系统的优先级别。点击部门管理,出现图4所示: 图4部门管理界面 1)添加部门:点击“新增”,填写部门名称和优先级如图所示 图5【添加更新部门信息】对话框 点击“保存”,则新建成功,出现下图所示,点击“确认”完成更新,放弃

新建则点击“关闭”或者直接关闭小窗口。 图6【确认】对话框 2)修改部门:点击要修改部门后方“修改”键,出现如图5所示,修改完成后点击“保存“,出现如图6相同提示,点击“确认”即可。 3)删除部门:操作同上。 1.1.2用户管理 用户管理:对用户进行管理,主要由新增,删除用户,以及更改用户相关信息。点击“用户”下“用户管理”按键,出现图7所示信息显示窗口: 图7用户管理界面 1)新增用户:点击“新增”,出现如下图所示。按要求填写并选择内容,完成后点击“保存”,之后“确认”即可(“状态”如果不是“激活”状态,则无法用新账号登陆)。 图8【添加用户】对话框

C#引用类型和值类型的区别

实际举例C#引用类型和值类型的区别 我们都知道,c#的两大数据类型分别为值类型和引用类型。很多人或许闭着眼睛都能说出值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但是当被问及到二者之间的联系和区别,什么时候用struct什么时候用class时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。 ?值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。 ?从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。 ?值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType 本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。 ?C# 的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡使用它,同时也要尽量避免隐式装拆箱的发生。 注:栈是操作系统分配的一个连续的内存区域,用于快速访问数据。因为值类型的容量是已知的,因此它可存储在栈上。而托管堆是CLR在应用程序启动时为应用程序预留的一块连续内存区,是用于动态内存分配的内存区,引用类型的容量只有到运行时才能确定,所有用堆来存储引用类型。 C#的两种数据类型延伸之一--嵌套类型的内存分配 对于引用类型嵌套值类型,以及值类型嵌套引用类型的情况下,内存分配可以根据以下两条规律来判断: ?引用类型始终部署在托管堆上; ?值类型总是分配在它声明的地方:作为字段时,跟随其所属的对象存储;作为局部变量时,存储在栈上。 C#的两种数据类型延伸之二--string类型 string是一个很有意思的引用类型,为什么说它很有意思呢?因为它表现了很多值类型的特点。请看一下代码示例: 示例1 string str1 = "abc";

语言描写教案

《人物语言描写训练》教案 教学目标: 掌握语言描写的几种技法。技法。激发作文兴趣。 教学重点:掌握语言描写的几种技法。 教学难点:掌握语言描写的几种技法。 教学过程: (一)导入 前段时间我们进行了景物描写和人物的动作描写训练,今天我们继续进行人物描写的训练——语言描写。 (二)小试手笔 唐僧师徒四人到西天取经。有一天他们走到了一个荒郊野地,又饿又渴,于是分头寻找食物。真巧,他们每个人都看见了一个绿油油的大西瓜。…… 你猜猜,他们各自会说些什么呢?(一分钟思考时间) (学生发言。师可追问,适时简短评议) (我们再看一个优秀示例):唐僧说:“阿弥陀佛——善哉善哉!” 猪八戒说:“呵呵,太好了!俺老猪早就渴了。” 孙悟空说:“别急!这荒郊野地的,哪来的西瓜?待俺老孙看看再说。” 沙和尚说:“还是听大师兄的吧。” (师:究竟怎样进行语言描写才能达到生动感人的效果呢?今天教给同学们几把语言描写的钥匙。) (三)作文指导: (1)什么是语言描写 语言描写是对人物的独白、对话及其说话时的神态、动作、语气等的描写,其主要作用是刻画人物性格。(生齐读) 1、第一把钥匙:身份年龄联系法。 人物的语言必须个性化,符合人物独特的身份、地位、年龄、职业、心理状态、文化教养等,使读者闻其言便知其人。(生个别读) 例1:有家哥俩闹分家,分了几天也没分清,决定请裁缝、厨师、船老大、车把式四人来说和。这四人觉得事情棘手,于是相邀先到厨师家碰个头,讨论一下。 说:“我看咱们去了要快刀斩乱麻,别锅了碗了分不清。” 说:“咱们办事不能太偏了,要针过去线过去才行。” 接过话茬儿:“嗨,咱原先也不是没有管过这号事,前有车,后有辙,别出格就行。” 听得不耐烦了:“我看别在这里罗嗦了,不如到他家再见风使舵。” 厨师的媳妇“扑哧”一声笑了:“你们真是三句话不离本行,卖什么的吆喝什么。” (师:厨师的媳妇说的多好啊!三句话不离本行,所谓是各说各话,身份年龄职业性格文化层次的不同,说出来的话就不一样,否则就让人显得不伦不类了。) 例2:不识字的农民李大伯说:“今天的菜真咸,氯化钠(食盐的化学名称)放得太多了。” 这样的语言描写符合说话人的身份吗? (师:这样的语言描写,使目不识丁的李大伯变成了知识分子。还是李大伯本人吗?) 2、第二把钥匙:场合情境融入法 人物的语言描写还要注意场合情境,写出人物在特定环境条件下的语言。比如上课时、游戏时、在家时、在外时……即使是同一个人,同一句话,在不同场合说的方式、语气都应

值类型和引用类型的区别

值类型和引用类型的区别[转] 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%,哈哈,我该买彩票去! 言归正传,咱还是先来探讨探讨这二者之间有什么区别吧。记得有一次电话面试中,我直接跟面试官说:“值类型是现金,引用类型是存折”,后来想想当时说这话虽是有点儿冲动地脱口而出,但也没什么不妥。我这人不善于背理论的教条,喜欢把书本上那些生硬的话跟现实生活中常见的事物联系起来理解和记忆。 直白点儿说:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。 声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像您的银行账号一样。具体哪些类型是值类型哪些是引用类型,大家翻翻书,背一背就好了,不过我想,做过一段时间的开发,即使您背不了书上教条的定义,也不会把值类型和引用类型搞混的。接下来,还是老规矩,咱看码说话吧。 1:public class Person 2: { 3:public string Name { get; set; } 4:public int Age { get; set; } 5: } 6: 7:public static class ReferenceAndValue 8: { 9:public static void Demonstration() 10: { 11: Person zerocool = new Person { Name = "ZeroCool", Age = 25 }; 12: Person anders = new Person { Name = "Anders", Age = 47 }; 13: 14:int age = zerocool.Age; 15: zerocool.Age = 22; 16: 17: Person guru = anders; 18: https://www.sodocs.net/doc/272407155.html, = "Anders Hejlsberg"; 19: 20: Console.WriteLine("zerocool's age:\t{0}", zerocool.Age); 21: Console.WriteLine("age's value:\t{0}", age); 22: Console.WriteLine("anders' name:\t{0}", https://www.sodocs.net/doc/272407155.html,);

值类型和引用类型的区别

区别: 1、值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高。 2、引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例。 3、值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object。 4、值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量保存了其数据的引用地址,因此以引用方式进行参数传递时会影响到参数本身,因为两个变量会引用了内存中的同一块地址。 5、值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式。我会在下节以专门的篇幅来深入讨论这个话题。 6、典型的值类型为:struct,enum以及大量的内置值类型;而能称为类的都可以说是引用类型。 7、值类型的内存不由GC(垃圾回收,Gabage Collection)控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,由GC来完成,微软甚至建议用户最好不要自行释放内存。 8、值类型是密封的(sealed),因此值类型不能作为其他任何类型的基类,但是可以单继承或者多继承接口;而引用类型一般都有继承性。 9、值类型不具有多态性;而引用类型有多态性。 10、值类型变量不可为null值,值类型都会自行初始化为0值;而引用类型变量默认情况下,创建为null值,表示没有指向任何托管堆的引用地址。对值为null的引用类型的任何操作,都会抛出NullReferenceException异常。 11、值类型有两种状态:装箱和未装箱,运行库提供了所有值类型的已装箱形式;而引用类型通常只有一种形式:装箱 S:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 2.1.2 .NET的3C:CTS、CLS和CLR .NET结合Java和COM解决方案两者优点来解决互操作性问题。类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统Common Type System(CTS)的类型标准。这个类

int与Integer的区别(Java各种数据类型详细介绍及其区别)

Java各种数据类型详细介绍及其区别基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。 Java中的简单类型从概念上分为四种:实数、整数、字符、布尔值。但是有一点需要说明的是,Java里面只有八种原始类型,其列表如下: 实数:double、float 整数:byte、short、int、long 字符:char 布尔值:boolean 复杂类型和基本类型的内存模型本质上是不一样的,简单数据类型的存储原理是这样的:所有的简单数据类型不存在“引用”的概念,简单数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。 Java的简单数据讲解列表如下: int:int为整数类型,在存储的时候,用4个字节存储,范围为-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0。 short:short也属于整数类型,在存储的时候,用2个字节存储,范围为 -32,768到32,767,在变量初始化的时候,short类型的默认值为0,一般情况下,因为Java本身转型的原因,可以直接写为0。 long:long也属于整数类型,在存储的时候,用8个字节存储,范围为 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807,在变量初始化的时候,long类型的默认值为0L或0l,也可直接写为0。 byte:byte同样属于整数类型,在存储的时候,用1个字节来存储,范围为-128到127,在变量初始化的时候,byte类型的默认值也为0。 float:float属于实数类型,在存储的时候,用4个字节来存储,范围为32位IEEEE 754单精度范围,在变量初始化的时候,float的默认值为0.0f或0.0F,在初始化的时候可以写0.0。

人物语言描写方法

人物语言描写训练 一、语言描写: 通过对人物对话、独白及语气的描写,以表现人物身份、思想、感情和性格的写作方法。 二、语言描写的方法: 1、身份年龄联系法:人物的语言必须个性化,符合人物独特的身份、地位、年龄、职业、心理状态、文化教养等,使读者闻其言便知其人。 例子:小表妹天真又活泼,有时候她会突然冒出一些你意想不到的话来。一次,她一本正经地对外公说:“外公,我们全家只有你最开心,你有好多名字:阿爸、外公、老头子、沈常根、老伯伯、爷爷……谁的名字也没你多。” 2、场合情境融入法:人物的语言描写还要注意场合情境,写出人物在特定环境条件下的语言。比如上课时、游戏时、在家时、在外时……即使是同一个人,同一句话,在不同场合说的方式、语气都应有所不同。 例:小明的语文课本不见了 情况一:课堂上,小明的语文课本不见了-----他小心翼翼地翻着书包,心里默念道:“语文书,语文书呢,在哪呢?” 情况二:下课了,小明的语文课本不见了-----他着急地翻着抽屉,大声喊道:“语文书哪里去了?谁见过我的语文书呀?书!书!” 情况三:在家里,小明的语文课本不见了------ “老妈!快来呀!我的语文书飞了!快,帮我找找!” 3、神态动作辅助法:对话描写时,要注意人物的表情与动作,并惟妙惟肖地模拟出来。 赏析下面两组语言,分析哪个好,为什么? ①玻璃窗被砸坏了,开了一个篮球大的窟窿。班主任走了过来,说:“谁弄坏的?”董小天说:“没看见。”高芳芳说:“是董小天踢的。”董小天不承认。老师说:“还有谁看见了?”李星说:“没看见。” ②玻璃窗被砸坏了,开了一个篮球大的窟窿。班主任走了过来,瞪着眼:“谁弄坏的?”捣乱鬼董小天斜着眼,冷笑道:“鬼才知道,又没有人叫我们一定要看好玻璃窗?”旁边的张小勇朝老师做了个鬼脸:“哈……,开了口,好凉快哟!”谁知这一下却惹恼了站在旁边的高芳芳,她大声说道:“是董小天,他和张小勇在玩,拿扫把大闹天宫,张小勇推了董小天一把,董小天一火,抡起扫把朝他使劲地打去,结果张小勇一躲闪,董小天就打到了玻璃,碎了。”董小天一跺脚:“大白天别说梦话!你小心点,不要诬陷好人!”高芳芳理直气壮:“我才不瞎说呢,大家都看见的。你凭什么做了坏事,还耍嘴。”老师望了望四周,说:“还有谁看见了?”“我……没看见。”李星使劲地咽了一下口水,神情恍惚。 答:我觉得好,因为。

类与结构体的区别

区别有三: 1: 类可以继承,结构不可以. 2: 类是引用类型,结构是值类型 3: 类在堆中,结构在栈分配内存 二 .类与结构的差别 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的 sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage { void Paint(); } struct Picture : IImage { public void Paint() { // painting code goes here } private int x, y, z; // other struct members }

相关主题