您的位置:首页 > 其它

.Net深复制、浅复制

2016-04-21 20:05 309 查看
在.Net,大家都知道引用类型的深复制、浅复制吧。

,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制。若objA=objB,则objA和objB本质上对应着内存中的一块地址、共享空间。所以objB.PropA=XXX,会导致objA.PropA也会变化。如果不注意、就会导致意外的问题,而且很难注意、debug。这种情况,基本都得用深复制来解决。

下面举例来说

protected void Page_Load(object sender, EventArgs e)
{
//string虽然也是引用类型,但微软对string做了特殊处理、对外表现的像值类型
//以下分别独立
string s1 = "111";
string s2 = "111";
string s3 = s2;
s1 = "111111111111111";
s2 = "222222222222222";

//引用类型
var list = GetElemsFromDBOrCache();
list[0] = "1111111111111111";
Response.Write(list[0]);
}

private List<string> GetElemsFromDBOrCache()
{
List<string> list;
if (Cache["key"] != null)
{
list = Cache["key"] as List<string>;
}
else
{
list = new List<string> { "1", "2", "3" };  //从DB中读取,此处省略
Cache["key"] = list;
}
//在调用端修改list会导致修改缓存:因为调用端修改list=>引用本地Cache,浅复制、
return list;

//使用深复制方法,避免在方法外修改缓存
//深复制方法1:
//List<string> newList = new List<string>();
//foreach (var elem in list)
//{
//    newList.Add(elem);
//}
//return newList;
//深复制方法2:序列化后返回新变量              可能还有其他方法
//string json = JsonConvert.SerializeObject(list);
//List<string> newList = JsonConvert.DeserializeObject<List<string>>(json);
//return newList;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: