簡體   English   中英

在C#中為同一類將一個會話分配給另一個會話

[英]Assign one session to another session for same Class in C#

我為同一個班級創建了2個會話。

    public static Breadcrumb Breadcrumb
    {
        get { return HttpContext.Current.Session["Breadcrumb"] != null ? (Breadcrumb)HttpContext.Current.Session["Breadcrumb"] : null; }
        set { HttpContext.Current.Session["Breadcrumb"] = value; }
    }

    public static Breadcrumb ChildBreadcrumb
    {
        get { return HttpContext.Current.Session["ChildBreadcrumb"] != null ? (Breadcrumb)HttpContext.Current.Session["ChildBreadcrumb"] : null; }
        set { HttpContext.Current.Session["ChildBreadcrumb"] = value; }
    }

和用於會話的類如下

[Serializable]
public class Breadcrumb
{
    public string project { get; set; }
    public int projectId { get; set; }
}

在一個事件中,我僅將一次面包屑分配給ChildBreadcrumb。

但是,在分配后更改面包屑時,ChildBreadcrumb始終更新。

如何防止此自動更新?

在頁面生命周期結束之前,會話不會進行序列化,並保存在那里。 這意味着直到那時這兩個引用都指向同一對象。

本質上,您正在執行此操作:

var A = new Breadcrumb { project = "original" };

var B = A;

B.project = "change";

由於面包屑是一class它們是引用類型AB都是對同一Breadcrumb引用

為了避免這種情況,在將Breadcrumb分配給ChildBreadcrumb時,請復制它,例如:

var A = new Breadcrumb { project = "original" };

var B = new Breadcrumb { project = A.project, projectId = A.projectId };

B.project = "change";

現在, B是一個獨立副本。

注意project是一個不可變的stringprojectId是一個int值類型,因此它們的行為與Breadcrumb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM