[英]multiple instances of C# DataTable stored in session ..how this reference works?
我对存储在Session
中的DataTable
和从该Session
检索它时的代码执行有疑问。 也许这不是问题,只是我错误地理解了实例和引用的真正工作原理。
我有一个 POCO class User
,我在其中存储了登录用户的所有数据。 POCO Class 如下所示:
public class User
{
public int UserID { get; set; }
public string UserFirstName { get; set; }
public string UserLastName { get; set; }
public DataTable UserRights { get; set; }
}
用户登录后(在登录页面上),我创建了一个User
class 的实例,并将所有从登录中检索到的数据存储到Session["User"]
中:
User _user = new User();
_user = MyLogin.GetUser() // method returns filled User object with data from db
Session["User"] = _user; // I store it into session
然后在我的页面上,当我需要来自 Session 的数据以获得用户权限(存储在数据表中)时,我查看 session 并检索 DataTable:
User _currUser = (User)Session["User"];
DataTable dt = new DataTable();
dt = _currUser.UserRights;
此代码工作正常,但是当我在同一页面上多次查看 DataTable UserRights 的 Session 时,会出现一些奇怪的行为。
示例:我在页面上有两个用户控件,在每个用户控件中,我都查看了 session 的 DataTable ,就像上面的代码一样。 然后,如果我在其中一个用户控件代码中更改 DataTable object 实例,例如:
dt.Columns.Remove("RoleID");
...此更改也会影响第二个用户控件中的实例(??)。 如果给实例不同的名称也是如此:
// FirstUserControl.ascx.cs
User _currUser1 = (User)Session["User"];
DataTable dt1 = new DataTable();
dt1 = _currUser1.UserRights;
dt1.Columns.Remove("RoleID")
// SecondUserControl.ascx.cs
User _currUser2 = (User)Session["User"];
DataTable dt2 = new DataTable();
dt2 = _currUser2.UserRights; <--- dt2 is without column "RoleID" too!?
有人可以清楚地向我解释为什么会发生这种情况以及在这个例子中实例和引用是如何工作的(看起来我没有正确理解它们)。 我一直认为,如果我执行上面这样的代码,我会得到dt1
和dt2
DataTable
object 在处理它们时不会有任何共同点。
DataTable 是一个引用类型,dt1 和 dt2 只是 memory 保存数据表的块的 memory 地址,它们始终引用相同的 ZA8CFDE6331BD59EB2AC96F8911C4B6666Z。
在这种情况下,您可以使用DataTable.Copy()
User _currUser1 = (User)Session["User"];
DataTable dt1 = _currUser1.UserRights.Copy();
dt1.Columns.Remove("RoleID")
// SecondUserControl.ascx.cs
User _currUser2 = (User)Session["User"];
DataTable dt2 = _currUser2.UserRights.Copy();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.