网站建设SQL 服装绘图仪_百年灵手表好看不_百度空间

什么是“性能”?通俗的讲就是应用程序尽快地运行,尽可能的多处理并发用户。专业术语就是:系统执行任务的速度和效率。对网站用户而言就是让用户感到“快”。衡量“性能”的指标由很多,例如:页面吞吐量(站点能够服务的每秒页面数),每秒服务的页面越多,站点能够服务的用户就越多。站点的“性能”瓶颈在日常生活中经常可见:某门户网站平时在并发用户数小于5000的情况下能够较好的运行,但在发生类似911事件的情形下网站的并发用户数突破5000甚至10000后,站点的负载接近饱和。此时需要对站点的性能进行优化扩展站点。优化的方式有多种:垂直扩展、水平扩展、代码优化。以下对这三种方式进行简单的叙述:
垂直扩展:又称向上扩展,指替换、升级现有的硬件,或在系统中添加新设备。对一台机器的升级主要是对CPU、内存、磁盘等设备的升级。升级是有局限性的,对性能的提高有局限。
水平扩展:又称向外扩展,是在安装中添加新的服务器并把负载分布在各台服务器之间。该方式可以大幅度地扩展,提高系统的冗余能力,降低扩展成本,是{wy}能够处理大量高度集中的请求并保证{bfb}正常运行时间的方法。可以通过Windows2000的网络负载平衡(NLB)来实现,。Google就是采用该方式,群集中有数万台PC机。但这种方式使得会话管理变得复杂,传统的ASP将会话储存在内存中,在水平扩展的方式下不能将会话存储在内存中,某服务器从群集中撤出则会话实效。ASP.NET将会话储存在数据库中的技术,使得会话也能在网络负载平衡中使用。该方式能线形的提高网站性能。
代码优化:是最容易被忽视的提高性能的方式,该方式要求对系统进行全面详尽的分析,了解系统瓶颈所在,何处需要进行优化。比如:在ASP.NET中提供了很多缓存技术,因此需要了解何处使用缓存,是否定义缓存体系的构架,缓存使用是否合理等。此外还要了解页面对数据库调用的次数等。因此,该方式对系统分析人员,代码编写者有较高的要求。
对上面几种扩展方式有了了解后可以看出{zh0}的扩展方式是:水平扩展。水平扩展在静态HTML的页面服务中可以得到无限的扩展,然而在应用程序对页面进行多次数据库调用时,数据库可能成为瓶颈。此时,服务器扩展的优势会降低。在设计站点时尽可能的靠近静态HTML,适当灵活的使用缓存可以在某一时刻模拟静态HTML,使性能有一定的提高。
《ASP.NET建设网站之性能调校实践篇》主要对“代码优化”进行讲解,在讲解之前读者要知道任何站点都有瓶颈,如何提高性能降低瓶颈是的目标。
ASP.NET突破了原先的ASP开发方式,使页面和代码分开。提高了开发、维护的效率。提供丰富的服务器控件使得网页的美观有了较大的提高,ASP.NET程序员对此乐此不疲,对ASP.NET的优点不断挖掘。ASP.NET的新功能是如此的强大,功能强大的工具使程序员变得“不值钱”,但并非如此。强大的工具使程序员从复杂的页面设计和编写代码中解放出来,可以有足够的时间思考更高的技术。ASP.NET的服务器控件在建设网站方面提供了方便,但如何高效使用是很有讲究的,。懒惰求值、字符串处理的细微差别会使代码质量有了很大的提高。对诸如此方面的探讨是相当有趣的。现在介绍提高ASP.NET性能的几方面内容。
一、.NET语言的选择
VB.NET、C#.NET是目前.NET程序员常用的编程语言。如何对两种语言进行抉择,要看.NET的编译环境是如何处理的。在编译.NET应用程序时,实际是把应用程序编译为MSIL。因此,系统采用的编程语言是VB.NET还是C#.NET对交付系统的运行都没有特别的性能差异。但在开发过程中对代码编写者的要求和开发速度以及各自的特性都有明显的区别。请看以下情况:
With
End With
using{}
区分大小写
回车、换行、Tab等特殊字符处理
智能感知
程序员类别
索引
C#.NET
不支持
支持
区分
特殊字符来处理

国内较多
[i]
VB.NET
支持
不支持
不区分
名空间:Microsoft.VisualBasic来处理(vbCrLf)

国外流行
(i)
说明:
1.With…End With用法如下:
WithLabel1
.Text = "Hello"
.Visible =True
EndWith
可以编写较少的代码,“模块”的表现提高了程序的可读性。
2.using{}对Dispose的处理自动化。
3.对于回车等特殊字符VB.NET使用vbCrLf等常量,对程序员较为直观。C#.NET使用n等特殊字符,需要时要使用转义字符。
4.索引表示C#.NET使用[],函数参数C#.NET使用(),VB.NET都使用()。在这方面C#.NET比VB.NET表述更为清楚。
以上表格只列出常见的区别,在实际开发过程中,可以更具开发人员的习惯进行选择。
二、状态管理:
1、viewstate管理
先介绍一下服务器控件的含义:服务器控件简言之是页面上能被服务器代码访问和操作的任何控件。大多数服务器控件都继承自System.Web.UI.Control类,都有Dispose方法用于GC处理。ASP.NET为所有的服务器控件(服务器控件使用runat=”server”属性指定)提供了视图状态。当ASP.NET以HTML的形式呈现页面时,创建一个隐藏的窗体字段_VIEWSTATE。此字段存储的是一个加密、标记化的字符串,包含ASP.NET页面上每个控件的名/值对。每个控件存储的值实际上是与控件关联的值和状态信息。当页面被发送回服务器时(一个回送),ASP.NET可以轻松的使用这些值并重构页面控件。在了解了viewstate后看以下例子:
新建ASP.NET的Web应用程序。在WebForm1.aspx页面添加以下控件:
在WebForm1.aspx.vb中添加以下代码:
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValAsSystem.EventArgs)HandlesButton1.Click
Label1.Text = TextBox1.Text
EndSub
完成以上工作后运行项目,在生成页面中的文本框里输入:aaaaa,单击按钮,此时页面刷新,在Label1种显示:aaaaa。
这是一个简单的页面,现在看一下该页面的源文件:在该源文件中有一个name是__VIEWSTATE的hidden控件,该控件在并没有在页面中制作,是.NET自动生成的,此控件的value属性是难以阅读的字符。这就是前面提到的视图状态。
“停止调试”项目,在WebForm1.aspx的HTML文中的<% @Page %>里添加:EnableViewState=false内容。将Label、TextBox、Button的EnableViewState属性置为:False。此时运行项目,在生成页面中的文本框里输入:aaaaa,单击按钮,此时页面刷新,在Label1种显示:aaaaa。
看一下该页面的源文件:在该源文件中有一个name是__VIEWSTATE的hidden控件,此控件的value属性是难以阅读的字符,但value属性的内容比前一次项目生成后页面中的内容要少。
以上两次项目运行后页面源文件的内容有所不同,特别是__VIEWSTATE的hidden控件的值有了字节量上的不同。是什么造成了以上差异?EnableViewState属性在页面中的使用,引起了__VIEWSTATE的hidden控件值的字节量的差异。服务器控件在给用户带来方便的同时,由于通过生成__VIEWSTATE的hidden控件来保存相应服务器控件的视图状态,从而增加了页面的大小。因此在使用服务器控件时适当的关闭EnableViewState属性,减少__VIEWSTATE的hidden控件值的字节量,进而减少页面的大小,提高网页的下载速度,是提高性能的好办法。特别对于要求“实时”的结果,每次访问页面都要访问数据库的情况,可以关闭EnableViewState属性,来提高性能。
2、Session State管理
会话状态变量允许Web页面保存和用户浏览器的具体一次“会话”相关的信息。在同一次会话中接下来的页面可以按需要引用这些会话变量。该信息被绑定到用户的浏览器会话。一旦浏览器会话关闭,该信息就被删除。不需要进行会话处理的页面可以通过关闭会话状态(<% @page EnableSessionState=”False”%>)来提高性能。<% @page EnableSessionState=”ReadOnly”%>可以访问但不操作会话变量,可以适当的提高性能。
.Net为Session State管理提供了多种方法:InProc、State Server、SQL Server详细介绍请参照MSDN。
3、Application State管理
存储在一个Application对象中的信息在到ASP.NET应用程序的所有连接期间是静态的。
在.Net中设置应用级别的信息有两种方式:
1)Web.Config文件中对<appSettings>元素进行设置,见一下示例:
configuration>
appSettings>
addkey="condb"
value="server=localhost;database=northwind;uid=sa;pwd=; "/>
</appSettings>
……
</configuration>
在这段配置中定义了一个condb的应用程序级变量,值是连接数据库的字符串。这段配置在代码中通过以下方式使用:
DimstrCondbAsString
strCondb =CType(ConfigurationSettings.AppSettings("condb"),String)
2)在代码中使用Application对象。设置应用程序变量的值的{zh0}地方是Global.asax中的Application_Start事件。见以下代码:
SubApplication_Start(ByValsenderAsObjectByValAsEventArgs)
' 在应用程序启动时激发
Application(“condb”)=”server=localhost;database=northwind;uid=sa;pwd=;”
EndSub
在其他代码里通过以下方式使用应用程序级变量condb:
DimstrConDbAsString
strConDb =CType(Application("condb"),String)
Application对象的局限:为了保证数据的完整性必须锁定和解锁Application对象,因为应用程序的多个实例可能会在同一时间更新值。锁定和解锁可使用Application对象的Lock()和Unlock()方法来完成。锁定和解锁保证了数据的完整性,但这两个方法的使用会带来性能损失:其他ASP.Net应用程序实例在等待Application对象解锁时,基本上是被阻塞的。
4、Cache管理
ASP.NET提供了在一个ASP.NET应用程序级别上缓存信息的编程功能。该功能和Application对象相似,但具有在ASP.NET应用程序的生命周期内动态维护缓存信息的能力。在应用程序中缓存数据可以极大地提高性能,因为数据对服务器是本地,能够被快速的检索,不必重新查询最初的数据源。Cache和Application比较有以下优点:基于相关性的过期和删除、自动的锁定管理、回调机制。对Cache中的内容进行写入和访问时,要进行串行化处理,会有性能的损失。
5、静态变量
把变量声明为“静态”可以加关键字:Shared(VB.NET)、 static(C#.NET)。
前面提到的应用程序级变量:condb,在此变量中存放连接数据库的字符串。对此变量的定义可以在<appSettings>元素中,也可以在Application对象中,当然在Cache中定义也可以。在Application对象中定义需要Lock和UnLock,在Cache中定义有串行化方面的性能损失。如果将该变量声明为“静态”的就可以在项目中任意位置使用:myClass.condb,这样不仅起到了Application对象作用,也不用像Cache对象那样由于序列化而造成的性能损失。
以上是对ASP.NET的状态管理的多种方式进行简单的叙述,希望读者通过对Application、Session、Viewstate、Cache的灵活使用来提高性能。对以上各状态有其有点但局限性也十分明显。本人的观点是通过静态变量取代Application,对不需要使用回调机制和基于相关性的过期和删除的Cache也由静态变量来实现,除了不需要进行加锁、解锁、序列化、反序列化之外,在程序的任何出都可以使用,无需类型转化,这是各种状态管理所不能实现的。
三、页面控件
服务器控件简言之是页面上能被服务器代码访问和操作的任何控件。大多数服务器控件都继承自System.Web.UI.Control类,都有Dispose方法用于GC处理。
ASP.NET提供的控件有:HTML控件、Web Form控件、列表控件、移动控件、验证控件。
HTML控件在页面里生成HTML的普通标记。每个控件都有runat=”server”属性,意味着某些属性可以被服务器端代码操作。
Web Form控件功能十分强大,但会带来性能的损失。性能损失大致有两方面的原因:_VIEWSTATE隐藏字段值的字节量增加,起泡事件。减少_VIEWSTATE的字节量可以页面级使用<% @page EnableViewState=”false”%>或是在Web Form控件中使用EnableViewState=”false”来实现。起泡事件很难禁止,但可以使用<% @page AutoEventWireup="false"%>,以及将Web Form控件的AutoPostBack属性置为False,来避免不必要的事件触发。
列表控件如:DropDownList控件。此类控件有AutoPostBack属性,一般该属性默认值为false,可以更具需要将该值置true,比如根据DropDownList的值的变化来处理其他流程。
验证控件的功能十分强大,性能的消耗十分明显。
本人建议:用HTML控件代替不必要的服务器控件,少用服务器控件。 四、IsPostBack和PreRender
在制作动态页面时,页面和数据库的交互是不可避免的,在交互中处理不当会有相当的性能损失。在ASP.NET中提供了相当丰富的数据邦定控件如:DataGrid、DataList、Repeater控件,DropDownList等列表控件也有数据绑定功能。这些控件为用户的开发带来了方便,同样也会有性能消耗,减少性能消耗会极大地发挥这些控件的优势。这些消耗可能发生在以下两方面:从数据库中读取记录,把数据绑定到控件上。从数据库中读取记录是不可避免的,是应用程序和数据库打交道,瓶颈发生在数据库方面,对数据库的性能优化可以看《ASP.NET建设网站之数据库性能优化篇》。把数据绑定到控件上使用适当的方法可以减少性能消耗。在讲解这些方法之前看一下页面请求时会发生什么事件。
当请求一个页面时,会触发下列事件:Page_Init、Page_Load、控件起泡事件、Page_PreRender、Page_Unload。页面通过服务器控件上的一个操作(如单击按钮)刷新页面时,会产生到原始ASP.NET页面的一个回送。在回送期间,ASP.NET恢复所有ASP.NET服务器控件的值和状态,然后触发引发回送的事件。Page_Init和Page_Load事件先触发,然后服务器控件事件触发,接着是触发Page_PreRender、Page_Unload。看下面示例:
该示例是把数据库northwind的Customers表的记录读到页面上来,具体步骤如下:
在页面上添加ID为:dgCustomers的DataGrid控件,再添加ID为:Button1的按钮服务器控件。在此页面的中添加以下代码:
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValAsSystem.EventArgs)HandlesMyBase.Load
'在此处放置初始化页的用户代码
DimsqlCmdAsNewSqlCommand
WithsqlCmd
.Connection =NewSqlConnection("server=192.168.154.213;database=nor thwind;uid=sa;pwd=bc1lovebc2")
.CommandText = "select * from customers"
.CommandType = CommandType.Text
EndWith
DimdsAsNewDataSet
DimdtAdapterAsNewSqlDataAdapter(sqlCmd)
dtAdapter.Fill(ds, "customers")
dgCustomers.DataSource = ds.Tables("customers")
DataBind()
EndSub
运行此页面,在页面中显示了当前Customers表中的记录,如果这时单击button1,可以看到页面发生了刷新,根据前面的介绍可以看出当请求一个页面时,将会触发Page_Load事件。在此事件中由于存在读取数据库并且绑定数据控件的代码。因此,每次提交页面都会发生读取数据库、绑定控件的操作,此时便有了性能的消耗,由于我们没必要每次提交页面时都要获得数据,因此需要对以上代码进行精化,使我们在{dy}次读取页面时从数据库中获取数据,在以后页面提交时避免从数据库中读取数据,减少数据从数据库到应用程序的往返次数。这对提高性能是很重要的。改进后的代码如下:
PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValAsSystem.EventArgs)HandlesMyBase.Load
'在此处放置初始化页的用户代码
IfNotIsPostBackThen
DimsqlCmdAsNewSqlCommand
WithsqlCmd
.Connection =NewSqlConnection("server=192.168.154.213;database=nor thwind;uid=sa;pwd=bc1lovebc2")
.CommandText = "select * from customers"
.CommandType = CommandType.Text
EndWith
DimdsAsNewDataSet
DimdtAdapterAsNewSqlDataAdapter(sqlCmd)
dtAdapter.Fill(ds, "customers")
dgCustomers.DataSource = ds.Tables("customers")
DataBind()
EndIf
EndSub
这段代码把原先的数据读取和绑定放到了IfNotIsPostBackThen…EndIf中,IsPostBack用于判断页面是否{dy}次回送,在页面{dy}次加载时读取数据并绑定,在以后提交页面时不必每次都读取数据,减少了数据的往返。
Page_PreRender事件是页面内容被提交给请求的客户端之前调用的{zh1}一个事件。在页面上有多个控件要绑定不同数据源,特别是容器控件中某个子控件的事件触发后引起多个控件进行数据绑定的发生,在此情况下可以把绑定语句放到此事件中:
PrivateSubPage_PreRender(ByValsenderAsObjectByValAsSystem.EventArgs)HandlesMyBase.PreRender
DataBind()
EndSub
感兴趣的读者可以自行试验。
五、智能导航
读者在浏览页面时可能遇到下面情况:每次页面刷新后都会使当前控件失去焦点,ASP.NET提供的智能导航可以解决该问题,只刷新必要的控件,把用户带回到页面刷新前的位置。对提高用户的感觉性能是有帮助的。但此功能只使用于IE5.0及以上版本,对其他浏览器的支持不够,本人是不用此功能的。解决控件失去焦点的方法是尽可能的简化页面,使数据能在一屏显示。
六、异常处理
用try…catch捕获异常是良好的编程习惯,频繁使用Try…Catch会造成很大的性能损失,读者应该捕获“已知”的异常,在一般情况下不运行异常处理程序代码。看下面示例:
ModuleModule1
SubMain()
DimAsIntegerCInt(Console.ReadLine)
DimAsIntegerCInt(Console.ReadLine)
Try
Console.WriteLine(i / j)
CatchexAsException
Console.WriteLine(ex.ToString)
EndTry
Console.ReadLine()
EndSub
EndModule
在该代码中可能发生的异常是j=0的情况,此时i除以j的结果溢出(无穷大),即i/0。J<>0对程序员而言是“已知”的,如果此处使用try…catch进行异常捕获是不必要的性能损失,可以在if语句里进行判断:Ifj = 0ThenConsole.WriteLine("error")ElseConsole.WriteLine(i / j)用If语句代替try…catch可以减少性能损失。
七、提高用户的感官性能
让用户了解操作成功后的结果,让用户看到处理时的进程,不让用户在提交页面后无谓的等待,这些都是提高用户感官性能的办法。实现以上方法可以制作相应的提示页面:结果界面,有进度条的页面,把复杂的页面切割成多个小页面等。
八、把UI和代码分开
在页面中嵌入服务端代码在过去的ASP制作中是很常见的,但ASP.NET把UI和代码分开,程序员不必把代码写入页面了。
九、使用相对的URL寻址,在任何Web站点或目录的后面添加斜线“/”
十、页面缓存
页面缓存通过缓存一个Web Form请求的整个响应,能够实现更大的性能增益。一旦带缓存的页面执行了{dy}次,运行时将把结果存储在缓存中。然后运行时就可以从缓存中提取该页面的缓存版本满足后续的请求,因此避免执行该页面的代码,包括所有的数据查询、文件I/O和页面的其他处理。
实现页面缓存通过OutputCache指令,该指令有两个必需的参数:Duration、VaryByParm。还有VaryByHeader、VaryByCustom等可选参数。这些参数的用法可以参考MSDN。
建议对需要定时从数据库中读取记录的页面,而每次读取数据的间隔时间不是很短时,可以考虑采用OutputCache指令实现页面缓存
十一、“短路”运算
在使用C#.NET的用户可能经常使用“短路”运算。例如&&、||运算符,
inti=-10;intj=17;if(i>0 && j>0) Console.WriteLine("OK");
在该代码中如果i<0则不会判断j是否大于0,因为如果i<0无论j是否大于0返回的结果都是false;同理如果执行以下语句if(i>0 || j>0) Console.WriteLine("OK");如果i>0则不会判断j是否大于0,因为如果i>0无论j是否大于0返回的结果都是true。
但是在VB.NET中的And、Or不是“短路”运算符,And和Or都要计算运算符两侧的结果,这样会有不必要的运算。但在VB.NET中要实现“短路”运算,可以通过AndAlso、OrElse实现。AndAlso等同于&&,OrElse等同于||。
十二、不使用Public字段,使用属性
在设计类的过程中是用Public字段可以被其他成员访问,但该字段的安全性和封装性很差。推荐使用属性来代替Public字段。对属性使用前必须实例化拥有该属性的类,属性是特殊的方法在属性体里可以编写代码,这些都是Public字段无法拥有的好处。
十三、早期绑定和后期绑定
DimAsString属于早期绑定;Dims : s = "String"属于后期绑定,。后期绑定给开发人员带来了方便,但在运行时需要使用反射并查询对象的类型和方法,还要在不同类型的对象之间进行转换。这些都给性能带来了损失。使用早期绑定,编译器知道使用的对象引用的类型,运行时不需要使用反射,性能较后期绑定有了很大的提高。
Option Strict选项开关可以让用户决定是否允许使用后期绑定,就本人的观点而言后期绑定和反射技术在.NET里面功能相当强大,灵活使用反射技术可以创造出功能强大而代码相当精简的软件。建议读者在每个页面上通过<%@ Page Strict=”true”%>或<%@ Control Strict=”true”%>来关闭后期绑定的使用,不要在全局上关闭后期绑定和反射。
十四、数组的数组(锯齿数组)
锯齿数组在使用上是否恰当对性能是有些影响的。例如:创建一个二维数组用来存放一年的每{yt},可以这样声明数组:Dimymd(12,31)AsInteger。在这个二维数组中:行代表月份,列代表日。这个数组共有372个元素。但全年的天数是365天或366天,比二维数组定义的372个元素要少。可以用锯齿数组存放一年的每{yt}。锯齿数组的定义如下:Dimymd(12)()AsInteger。从该定义可以看出,ymd共有12个元素但每个元素都是Integer类型的数组,并且维数不定。维数是根据当月的实际天数来确定:ymd(i) =NewInteger(DateTime.DaysInMonth(DateTime.Now.Year, i)) {}。这样锯齿数组在内存消耗上比二维数组要少,在以后使用过程中对数据的检索比二维数组要快。感兴趣的读者自行试验。
十五、弱引用
把一个对象引用分配给一个变量时,该变量就包含对对象的一个强引用。GC不会收回强引用任在使用的对象。只有当变量离开作用域时,或是显式的给变量分配Nothing时,强引用才被删除。
弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。弱引用的用法如下:
DimstrLargeAsNewString("b"c, 4096)'声明一个名为strLarge,长度为4096的变量
DimweakRefAsNewWeakReference(strLarge)'声明一个弱引用的变量,把strLarge存放在里面
Application("weakRef") = weakRef'把弱引用对象存放在Application中
DimweakTargetAsWeakReference'声明一个弱引用的变量
IfNotApplication("weakRef")IsNothingThen'判断Application中是否存在strLarge
weakTarget =CType(Application("weakRef"), WeakReference)'Application中存放的strLarge对象转换成弱引用,交给weakTarget处理
DimtargetStrAsStringCType(weakTarget.Target,String'获取弱引用中的值
IftargetStrIsNothingThen'如果targetStr的值为空,说明对象被GC回收了
EndIf
EndIf
十六、装箱和拆箱
在.NET中数据类型主要分成两类:值类型和引用类型。编译器把值类型放在堆栈中,对值类型的访问时直接的。引用类型派生自Object类,运行时在堆上为引用类型分配存储空间。总是通过引用访问这个存储空间,GC跟踪这个存储空间,在将来进行收集。
值类型和引用类型的互相转换,在.NET中称为“装箱”和“拆箱”。装箱创建一个新的对象并把值类型的为复制到托管堆中,然后返回对新的存储位置的一个引用。这是一个隐式的操作,相对比较消耗资源。拆箱是把一个引用类型转换成值类型。
“装箱”和“拆箱”在项目开发过程中是非常常见的。在状态管理中已经频繁使用了“装箱”和“拆箱”。例如:
DimiLoginUserNumAsInteger=16
Application(“iLoginUserNum”)=iLoginUserNum
其中iLoginUserNum是个整形变量,用来存放当前登录的用户数。Application中存放的是Object,要把iLoginUserNum存放到Application中,需要将iLoginUserNum从整形转换成Object。这个过程称为“装箱”。iLoginUserNum=CType(Application(“iLoginUserNum”),Integer)+1是把Application中的iLoginUserNum值加1。在这个语句中需要把Application(“iLoginUserNum”)转换成整形,这个过程称为“拆箱”。
要减少“装箱”、“拆箱”带来的性能损失,可以设法避免“装箱”,避免“装箱”可以提高50%的性能。具体方法如下:
在Application(“iLoginUserNum”)=iLoginUserNum中iLoginUserNum是个值类型。如果是个引用类型,把引用类型放在Application中就可以避免“装箱”了。构架LoginUserNum类:
PublicClassLoginUserNum
Private_LoginUserNumAsInteger
PublicSubNewByValvalueAsInteger)
_LoginUserNum = value
EndSub
PublicPropertyValue()AsInteger
Get
Value = _LoginUserNum
EndGet
SetByValValueAsInteger)
_LoginUserNum = Value
EndSet&
TAG:
相关的主题文章:


郑重声明:资讯 【网站建设SQL 服装绘图仪_百年灵手表好看不_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——