tft每日頭條

 > 生活

 > c語言給字符串分配内存

c語言給字符串分配内存

生活 更新时间:2024-05-23 14:44:53

c語言給字符串分配内存?淺拷貝是指将對象中的數值類型的字段拷貝到新的對象中,而對象中的引用型字段則指複制它的一個引用到目标對象如果改變目标對象中引用型字段的值他将反映在原始對象中,也就是說原始對象中對應的字段也會發生變化,下面我們就來聊聊關于c語言給字符串分配内存?接下來我們就一起去了解一下吧!

c語言給字符串分配内存(中的深拷貝與淺拷貝)1

c語言給字符串分配内存

淺拷貝和深拷貝之間的區别:

淺拷貝是指将對象中的數值類型的字段拷貝到新的對象中,而對象中的引用型字段則指複制它的一個引用到目标對象。如果改變目标對象中引用型字段的值他将反映在原始對象中,也就是說原始對象中對應的字段也會發生變化。

深拷貝與淺拷貝不同的是對于引用的處理,深拷貝将會在新對象中創建一個新的和原始對象中對應字段相同(内容相同)的字段,也就是說這個引用和原始對象的引用是不同的,我們在改變新對象中的這個字段的時候是不會影響到原始對象中對應字段的内容。

所以對于原型模式(prototype pattern)也有不同的兩種處理方法:對象的淺拷貝和深拷貝

MemberwiseClone 方法創建一個淺表副本,方法是創建一個新對象,然後将當前對象的非靜态字段複制到該新對象。如果字段是值類型的,則對該字段執行逐位複制。如果字段是引用類型,則複制引用但不複制引用的對象;因此,原始對象及其複本引用同一對象。

下面為一個常用的類。

[Serializable] public class Persopn { public string Name { get; set; } public int Age { get; set; } public List<string> Likes{get;set;} }

其中Likes是引用類型,需要序列化或發序列化時,需要加上[Serializable]特性。

下面說一下淺拷貝,直接上代碼:

public object ShallowCopy() { return this.MemberwiseClone(); }

接下來說深拷貝,深拷貝有多種方式實現,下面分别一一說明:

通過反射實現

public Static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值類型則直接返回 if (obj is string || obj.GetType().IsValueType) return obj; object retval = Activator.CreateInstance(obj.GetType()); FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); foreach (FieldInfo field in fields) { try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); } catch { } } return (T)retval; }

通過xml序列化實現

public static T DeepCopyByXml<T>(T obj) { object retval; using (MemoryStream ms = new MemoryStream()) { XmlSerializer xml = new XmlSerializer(typeof(T)); xml.Serialize(ms, obj); ms.Seek(0, SeekOrigin.Begin); retval = xml.Deserialize(ms); ms.Close(); } return (T)retval; }

通過二進制序列化

public static T DeepCopyByBin<T>(T obj) { object retval; using (MemoryStream ms = new MemoryStream()) { BinaryFormatter bf = new BinaryFormatter(); //序列化成流 bf.Serialize(ms, obj); ms.Seek(0, SeekOrigin.Begin); //反序列化成對象 retval = bf.Deserialize(ms); ms.Close(); } return (T)retval; }

通過Newtonsoft序列化

public static T CloneJson<T>(T source) { if (Object.ReferenceEquals(source, null)) { return default(T); } var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace}; return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings); }

好了,目前c#常用的深拷貝基本就上面幾個,個人推薦最後一種,反射速度最慢,不建議采用。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved