ASP.NET页面间传值的几种方式
1。使用QueryString
使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案。
2。使用Session变量
使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:
1,在页面里添加必要的控件
2,创建可以返回表单的按钮和链接按钮
3,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里
4,使用Response.Redirect(或Server.Transfer)方法重定向到另一个页面
5,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它
下面的代码片断演示了如何实现这个方法:
源页面WebForm1.aspx.cs中的部分代码:
private void Button1_Click(object sender, System.EventArgs e)
{
//textbox1 and textbox2 are webform
//controls
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("WebForm2.aspx");
}
目标页面WebForm2.aspx.cs中的部分代码:
private void Page_Load(object sender, System.EventArgs e)
{
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
}
3.使用Server.Transfer
这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:
1,在页面里添加必要的控件
2,创建返回值的Get属性过程
3,创建可以返回表单的按钮和链接按钮
4,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面
5,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了
以下代码综合实现上述步骤过程的代码:
源页面WebForm1.aspx.cs中的部分代码:
把以下的代码添加到页面中
public string Name
{
get
{
return TextBox1.Text;
}
}
public string EMail
{
get
{
return TextBox2.Text;
}
}
然后调用Server.Transfer方法
private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("WebForm2.aspx");
}
目标页面代码:
在WebForm2.aspx中务必在第一句话添加
<%@ Reference Page="~/WebForm1.aspx" %>或
<%@ PreviousPageType VirtualPath="~/WebForm1.aspx" %>
然后在WebForm2.aspx.cs中添加如下。
private void Page_Load(object sender, System.EventArgs e)
{
//create instance of source web form
WebForm1 wf1;
//get reference to current handler instance
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
}
如果在调试的过程中遇到错误.就到C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files中把新建的网站名的文件夹删掉.(要先关掉Visual Studio开发环境再删)
4.使用@PreviousPageType指令
这个指令是.net 2.0中的一个新指令,用于处理ASP.NET 2.0提供的跨页面传送新功能.用于批定跨页面的传送过程起始于哪个页面.包含两个属性:
TypeName:设置回送时的派生类名
VirtualPath:设置回送时所传送页面的地址.
如下示例:
源页面WebForm1.aspx中有一个TextBox,ID为txtName.在WebForm1.aspx.cs中设置一个属性:
public TextBox Name
{
get{return this.txtName;}//返回一个控件对象
}
在目标页面的设计文件中(WebForm2.aspx)的最上方加上:
<%@ PreviousPageType VirtualPath="~/Page1.aspx"%>,
然后就能引用WebForm1.aspx中定义的属性了.
在WebForm2.aspx.cs中可以有如下引用形式(假设WebForm2.aspx中有一个ID为lblName的Label):
lblName.Text="Hello"+PreviousPage.Name.Text+"<br />";
5.利用某些控件的PostBackUrl属性
示例:仍然是源页面WebForm1.aspx和目标页面WebForm2.aspx.
WebForm1.aspx中的部分代码:
<asp:Button ID="btnPostBack" Runat="server" Text="PBButton"></asp:Button>
<asp:TextBox ID="txtName" Runat="server" ></asp:TextBox>
<asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
WebForm2.aspx.cs中的部分代码:
protected void Page_Load(object Sender,System.EventArgs e)
{
TextBox txtName;
Calendar calendar1;
txtName=(TextBox)PreviousPage.FindControl("txtName");
calendar1=(Calendar)PreviousPage.FindControl("Calendar1");
Label.Text="Hello,"+txtName.Text+calendar1.SelectedDate.ToShortDateString();
}
使用这种方法存在一个问题:如果在没有单击那个按钮之前,也就是未处理WebForm1.aspx之前,有人请求了WebForm2.aspx,该怎么办?这就需要在WebForm2.aspx中的代码处理之前加一个判断.使用IsCrossPagePostBack属性,这与IsPostBack属性很相似,它允许检查请求是否来自WebForm1.aspx.如下:
protected void Page_Load(object Sender,System.EventArgs e)
{
if(PreviousPage.IsCrossPagePostBack)
{
TextBox txtName;
Calendar calendar1;
txtName=(TextBox)PreviousPage.FindControl("txtName");
calendar1=(Calendar)PreviousPage.FindControl("Calendar1");
Label.Text="Hello,"+txtName.Text+calendar1.SelectedDate.ToShortDateString();
}
else
{
Response.Redirect("WebForm1.aspx");
}
}
6. 使用Cookie对象变量
这个也是大家常使用的方法,与Session一样,是对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
HttpCookie cookie_name = new HttpCookie("name");
cookie_name.Value = Label1.Text;
Reponse.AppendCookie(cookie_name);
Server.Transfer("b.aspx");
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Request.Cookie["name"].Value.ToString();
}
7. 使用Application 对象变量
Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
Application["name"] = Label1.Text;
Server.Transfer("b.aspx");
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
Application.Lock();
name = Application["name"].ToString();
Application.UnLock();
}
soruce: http://blog.csdn.net/MicrosoftCenterOfHN/archive/2009/05/12/4170404.aspx
ASP.NET控件的执行生命周期
ASP.NET控件的执行生命周期如表6-1所示:
阶段 | 控件需要执行的操作 | 要重写的方法或事件 |
初始化 | 初始化在传入 Web 请求生命周期内所需的设置。 | Init 事件(OnInit 方法) |
加载视图状态 | 在此阶段结束时,就会自动填充控件的 ViewState 属性,控件可以重写LoadViewState 方法的默认实现,以自定义状态还原。 | LoadViewState 方法 |
处理回发数据 | 处理传入窗体数据,并相应地更新属性。 注意:只有处理回发数据的控件参与此阶段。 | LoadPostData 方法(如果已实现IPostBackDataHandler) |
加载 | 执行所有请求共有的操作,如设置数据库查询。此时,树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。 | Load 事件(OnLoad 方法) |
发送回发更改通知 | 引发更改事件以响应当前和以前回发之间的状态更改。 注意:只有引发回发更改事件的控件参与此阶段。 | RaisePostDataChangedEvent方法(如果已实现IPostBackDataHandler) |
处理回发事件 | 处理引起回发的客户端事件,并在服务器上引发相应的事件。 注意:只有处理回发事件的控件参与此阶段。 | RaisePostBackEvent 方法(如果已实现IPostBackEventHandler) |
预呈现 | 在呈现输出之前执行任何更新。可以保存在预呈现阶段对控件状态所做的更改,而在呈现阶段所对的更改则会丢失。 | PreRender 事件(OnPreRender方法) |
保存状态 | 在此阶段后,自动将控件的ViewState 属性保持到字符串对象中。此字符串对象被发送到客户端并作为隐藏变量发送回来。为了提高效率,控件可以重写SaveViewState 方法以修改ViewState 属性。 | SaveViewState 方法 |
呈现 | 生成呈现给客户端的输出。 | Render 方法 |
处置 | 执行销毁控件前的所有最终清理操作。在此阶段必须释放对昂贵资源的引用,如数据库链接。 | Dispose 方法 |
卸载 | 执行销毁控件前的所有最终清理操作。控件作者通常在 Dispose 中执行清除,而不处理此事件。 | UnLoad 事件(On UnLoad 方法) |
soruce : http://blog.csdn.net/zjwtnt/archive/2009/01/15/3791501.aspx
or http://blog.csdn.net/grgufo/archive/2008/02/20/2110123.aspx
ASP.NET 页生命周期概述 http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx
从页面的生命周期事件到页面基类(PageBase类)的编写
http://www.cnblogs.com/jiahaipeng/archive/2008/10/25/1319238.html#1583855
ASP.NET Application and Page Life Cycle
http://www.codeproject.com/KB/aspnet/ASPDOTNETPageLifecycle.aspx
ASP.NET Internals: Viewstate and Page Life Cycle
http://www.codeproject.com/KB/aspnet/aspnetviewstatepagecycle.aspx
The ASP.NET Page Lifecycle – A Basic Approach
从简单的JavaScript类到ASP.NET AJAX控件
http://www.codeproject.com/KB/aspnet/ASPNET_Page_Lifecycle.aspx
class是引用类型,struct是值类型;
class可以继承类、接口和被继承,struct只能继承接口,不能被继承;
class有默认的无参构造函数,有析构函数,struct没有默认的无参构造函数,且只能声明有参的构造函数,没有析构函数;
class可以使用abstract和sealed,有protected修饰符,struct不可以用abstract和sealed,没有protected修饰符;
class必须使用new初始化,结构可以不用new初始化;
class实例由垃圾回收机制来保证内存的回收处理,而struct变量使用完后立即自动解除内存分配;
从职能观点来看,class表现为行为,而struct常用于存储数据;
作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的。
如何选择使用结构还是类:
1).堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2).结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低
3).在表现抽象和多级别的对象层次时,类是最好的选择
4).大多数情况下该类型只是一些数据时,结构是最佳的选择
//javascript点击页面,判断鼠标左键,右键,中键点击事件
<script language=javascript>
function click()
{
if (event.button == 1)
{
alert('left');
}
if (event.button == 2)
{
alert('right');
}
if(event.button == 4)
{
alert('middle');
}
}
document.onmousedown = click;
</script>
ADO.NET中的五大对象
在ADO.NET中有 SqlConnection,SqlCommand,SqlDataReader,SqlDataAdapter,DataSet这五大内置对象。
ADO.NET主要分为:DataSet和.net frameword数据提供程序。
SqlCommand对象的三个方法:ExecuteNonQuery(),ExecuteReader(),ExecuteScalar();
ExecuteNonQuery()此方法用来执行增加(insert),删除(delete),修改(update)数据用,返回被sql语句影响的行数。在存储过程中遇到set nocount on时返回默认值,修改表中有触发器时,返回结果合实际结不同。
ExecuteReader()此方法用来读取表中数据,仅向前,速度比较快(相对于dataAdapter)。
ExecuteScalar()此方法用来读取select语句中返回的第一行第一列的值,返回值是object类型,注意思数据类型转换。
dataAdapter对象的Fill()方法用来填充数据集中的数据,Update()方法可以更新数据集中被修改的数据到数据库中。在调用Update()前先指定DbCommandBuilder,可以自动生dataAdapter对象的InsertCommand,UpdateCommand,DeleteCommand属性等。在生成这些Command对象前有一事值得注意,也就是当数据集中有新增数据时会生成InsertCommand,否则则不成生此对象。当数据集内数据发生更改时,此时会生成UpdateCommand,如果没有修改结果不生成此对象,当数据集内有删除数据时,生成DeleteCommand,如果没有删除数据不生成此对象。当数据集内没有数据发生改变时,此时调用Update()返回值为0,如果修改,有几行记录修改则返回几。
这五大内置对象为.net操作数据库必会的五大对象,缺一不可。
一、Response对象
Response对象是HttpResponse类的一个实例。该类主要是封装来自ASP.NET操作的HTTP响应信息。 1.Response对象的属性 ① BufferOutput 说明:获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个页之后将其发送 属性值:如果缓冲了到客户端的输出,则为true;否则为false。默认为true ② Cache 说明:获取Web页的缓存策略(过期时间、保密性、变化子句) 属性值:包含有关当前响应的缓存策略信息的HttpCachePolicy对象 ③ Charset 说明:获取或设置输出流的HTTP字符集 属性值:输出流的HTTP字符集 ④ IsClientConnected 说明:获取一个值,通过该值指示客户端是否仍连接在服务器上 属性值:如果客户端当前仍在连接,则为true;否则为false 2.Response对象的方法 Response对象可以输出信息到客户端,包括直接发送信息给浏览器、重定向浏览器到另一个URL或设置cookie的值。ASP.NET中引用对象方法的语法是“对象名.方法名”。“方法”就是嵌入到对象定义中的程序代码,它定义对象怎样去处理信息。使用嵌入的方法,对象便知道如何去执行任务,而不用提供额外的指令。 ① Write 说明:将指定的字符串或表达式的结果写到当前的HTTP输出 ② End 说明:停止页面的执行并得到相应结果 ③ Clear 说明:用来在不将缓存中的内容输出的前提下,清空当前页的缓存,仅当使用了缓存输出时,才可以利用Clear方法 ④ Flush 说明:将缓存中的内容立即显示出来。该方法有一点和Clear方法一样,它在脚本前面没有将Buffer属性设置为True时会出错。和End方法不同的是,该方法调用后,该页面可继续执行 ⑤ Redirect 说明:使浏览器立即重定向到程序指定的URL 二、Request对象 1.Request对象的属性 ① QueryString 说明:获取 HTTP 查询字符串变量集合 属性值:NameValueCollection对象 ② Path 说明:获取当前请求的虚拟路径 属性值:当前请求的虚拟路径 ③ UserHostAddress 说明:获取远程客户端的 IP 主机地址 属性值:远程客户端的IP地址 ④ Browser 说明:获取有关正在请求的客户端的浏览器功能的信息 属性值:HttpBrowserCapabilities对象 2.Request对象的方法 ① BinaryRead 说明:执行对当前输入流进行指定字节数的二进制读取 ②MapPath 说明:为当前请求将请求的URL中的虚拟路径映射到服务器上的物理路径 三、Application对象 Application对象是HttpApplicationState类的一个实例。 HttpApplicationState类的单个实例,将在客户端第一次从某个特定的ASP.NET应用程序虚拟目录中请求任何URL资源时创建。对于Web服务器上的每个ASP.NET应用程序,都要创建一个单独的实例。然后通过内部Application对象公开对每个实例的引用。Application对象使给定应用程序的所有用户之间共享信息,并且在服务器运行期间持久地保存数据。因为多个用户可以共享一个Application对象,所以必须要有Lock和Unlock方法,以确保多个用户无法同时改变某一属性。Application对象成员的生命周期止于关闭IIS或使用Clear方法清除。 1.Application对象的属性 ① AllKeys 说明:获取HttpApplicationState集合中的访问键 属性值:HttpApplicationState对象名的字符串数组 ② Count 说明:获取HttpApplicationState集合中的对象数 属性值:集合中的Item对象数。默认为0 2.Application对象的方法 ① Add 说明:新增一个新的Application对象变量 ② Clear 说明:清除全部的Application对象变量 ③ Get 说明:使用索引关键字或变数名称得到变量值 ④ GetKey 说明:使用索引关键字來获取变量名称 ⑤ Lock 说明:锁定全部的Application变量 ⑥ Remove/RemoveAll 说明:使用变量名称删除一个Application对象/删除全部的Application对象变量 ⑦ Set 说明:使用变量名更新一个Application对象变量的內容 ⑧ UnLock 说明:解除锁定的Application变量 四、Session对象 Session对象是HttpSessionState的一个实例。该类为当前用户会话提供信息,还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。 Session的出现填补了HTTP协议的局限。HTTP协议工作过程是,用户发出请求,服务器端做出响应,这种用户端和服务器端之间的联系都是离散的,非连续的。在HTTP协议中没有什么能够允许服务器端来跟踪用户请求的。在服务器端完成响应用户的请求后,服务器端不能持续与该浏览器保持连接。从网站的观点上看,每一个新的请求都是单独存在的,因此,当用户在多个主页间转换时,就根本无法知道他的身份。 使用Session对象存储特定用户会话所需的信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。 当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将中止该会话。 当用户第一次请求给定的应用程序中的aspx文件时,ASP.NET将生成一个SessionID。SessionID是由一个复杂算法生成的号码,它唯一标识每个用户会话。在新会话开始时,服务器将Session ID作为一个cookie存储在用户的Web浏览器中。 在将SessionID cookie存储于用户的浏览器之后,即使用户请求了另一个.aspx文件,或请求了运行在另一个应用程序中的.aspx文件,ASP.NET仍会重用该cookie跟踪会话。与此相似,如果用户故意放弃会话或让会话超时,然后再请求另一个.aspx文件,那么ASP.NET将以同一个cookie开始新的会话。只有当服务器管理员重新启动服务器,或用户重新启动Web浏览器时,此时存储在内存中的SessionID设置才被清除,用户将会获得新的SessionID cookie。 通过重用SessionID cookie,Web应用程序将发送给用户浏览器的cookie数量降为最低。另外,如果用户决定该Web应用程序不需要会话管理,就可以不让Web应用程序跟踪会话和向用户发送SessionID。 Session对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持cookie的浏览器中保留,如果客户关闭了cookies选项,Session也就不能发挥作用了。 ASP.NET的Sessions非常好用,能够利用Session对象来对Session全面控制,如果需要在一个用户的Session中存储信息,只需要简单地直接调用Session对象就可以了,下面就是个例子: Session["Myname"]=Response.form("Username"); Session["Mycompany"]=Response.form("Usercompany"); 应注意的是,Session对象是与特定用户相联系的。针对某一个用户赋值的Session对象是和其他用户的Session对象完全独立的,不会相互影响。换句话说,这里面针对每一个用户保存的信息是每一个用户自己独享的,不会产生共享情况。 很明显,对于不同的用户,Session对象的Myname变量和Mycompany变量各自是不同的,当每个人在网站的不同主页间浏览时,这种针对个人的变量会一直保留,这样作为身份认证是十分有效的。 1.Session对象的属性 ① Count 说明:获取会话状态集合中Session对象的个数 属性值:Session对象的个数 ② TimeOut 说明:获取或设置在会话状态提供程序终止会话之前各请求之间所允许的超时期限 属性值:超时期限(以分钟为单位) ③ SessionID 说明:获取用于标识会话的唯一会话ID 属性值:会话ID 2.Session对象的方法 ① Add 说明:新增一个Session对象 ② Clear 说明:清除会话状态中的所有值 ③ Remove 说明:删除会话状态集合中的项 ④ RemoveAll 说明:清除所有会话状态值 五、Server对象 Server对象是HttpServerUtility的一个实例。该对象提供对服务器上的方法和属性的访问。 1.Server对象的属性 ① MachineName 说明:获取服务器的计算机名称 属性值:本地计算机的名称 ② ScriptTimeout 说明:获取和设置请求超时 属性值:请求的超时设置(以秒计) 2.Server对象的方法 ① CreateObject 说明:创建COM 对象的一个服务器实例 ② CreateObjectFromClsid 说明:创建COM 对象的服务器实例,该对象由对象的类标识符(CLSID)标识 ③ Execute 说明:使用另一页执行当前请求 ④ Transfer 说明:终止当前页的执行,并为当前请求开始执行新页 ⑤ HtmlDecode 说明:对已被编码以消除无效HTML字符的字符串进行解码 ⑥ HtmlEncode 说明:对要在浏览器中显示的字符串进行编码 ⑦ MapPath 说明:返回与Web服务器上的指定虚拟路径相对应的物理文件路径 ⑧ UrlDecode 说明:对字符串进行解码,该字符串为了进行HTTP传输而进行编码并在URL中发送到服务器 ⑨ UrlEncode 说明:编码字符串,以便通过URL从Web服务器到客户端进行可靠的HTTP传输 六、Cookie对象 Cookie 是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。用户每次访问站点时,Web应用程序都可以读取Cookie包含的信息。 Cookie跟Session、Application类似,也是用来保存相关信息,但Cookie和其他对象的最大不同是,Cookie将信息保存在客户端,而Session和Application是保存在服务器端。也就是说,无论何时用户连接到服务器,Web站点都可以访问cookie信息。这样,既方便用户的使用,也方便了网站对用户的管理。 ASP.NET包含两个内部Cookie集合。通过HttpRequest的Cookies集合访问的集合包含通过Cookie标头从客户端传送到服务器的Cookie。通过HttpResponse的Cookies集合访问的集合包含一些新Cookie,这些Cookie在服务器上创建并以Set-Cookie标头的形式传输到客户端。 1.Cookie对象的属性 ① Name 说明:获取或设置Cookie的名称 属性值:Cookie的名称 ② Value 说明:获取或设置Cookie的Value 属性值:Cookie的Value ③ Expires 说明:获取或设置Cookie的过期日期和时间 属性值:作为DateTime实例的Cookie过期日期和时间 ④ Version 说明:获取或设置此Cookie符合的HTTP状态维护版本 属性值:此Cookie符合的HTTP状态维护版本 2.Cookie对象的方法 ① Add 说明:新增一个Cookie变量 ② Clear 说明:清除Cookie集合内的变量 ③ Get 说明:通过变量名或索引得到Cookie的变量值 ④ GetKey 说明:以索引值来获取Cookie的变量名称 ⑤ Remove 说明:通过Cookie变量名来删除Cookie变量 七、Cache对象 对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。有关此类实例的信息通过HttpContext对象的Cache属性或Page对象的Cache属性来提供。 1.Cache对象的属性 ① Count 说明:获取存储在缓存中的项数。当监视应用程序性能或使用ASP.NET跟踪功能时,此属性可能非常有用 属性值:存储在缓存中的项数 ② Item 说明:获取或设置指定键处的缓存项 属性值:表示缓存项的键的String对象 2.Cache对象的方法 ① Add 说明:将指定项添加到 Cache 对象,该对象具有依赖项、过期和优先级策略,以及一个委托(可用于在从Cache 移除插入项时通知应用程序) ② Get 说明:从 Cache 对象检索指定项 ③ Remove 说明:从应用程序的 Cache 对象移除指定项 ④ Insert 说明:向Cache对象插入项。使用此方法的某一版本改写具有相同key参数的现有Cache项 |
Finalize()和Dispose()之间的区别
Finalize()用于隐式释放资源,Dispose()用于显示释放资源
----------------------
NET中的内存管理通常会被认为是GC(Garbage Collection)的事情,程序员不用太操心。的确,GC通过对托管堆(Managed Heap)的管理
之所以有如此的不同是由于,当一个具有Finalizer(Finalize()方法)的对象被标记为可被回收时,GC并不直接回收它,而是将它的一个引用添加到一个特殊的队列里。一个独立的线程遍历这个队列,逐个调用队列中每个元素的Finalize()方法。Finalize()方法被调用过的对象会在下一次GC过程时被释放。程序员无权控制这个线程,同时也不能访问这个队列。而Dispose()是IDisposable接口的一部分,这个接口专门用来实现对象的清理工作。
-----------------------
对象生存期:如何创建和销毁对象
http://msdn.microsoft.com/zh-cn/library/hks5e2k6.aspx
Finalize 析构函数是只能从其所属类或派生类调用的受保护方法。当销毁对象时系统自动调用 Finalize,所以不应该从派生类的 Finalize 实现的外部显式调用 Finalize。与 Class_Terminate 不同(Class_Terminate 在对象设置为无效后立刻执行),在对象丧失范围和 Visual Basic .NET 调用 Finalize 析构函数之间通常会有延迟。Visual Basic .NET 还允许另一种析构函数 Dispose,该函数可以在任何时候显式调用以立即释放资源。
c# equals与==的区别
==操作比较的是两个变量的值是否相等。
equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
因此在上面的例子中,字符串a和字符串b的两个比较是相等的。
对于object g 和object h 时内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字符串a和b作这样的修改:
string a="aa";
string b="aa";
则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。
对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。
对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true。
http://www.cnblogs.com/jiahaipeng/archive/2008/04/11/1146316.html