일반적으로 원본 개체에 영향을 주지 않고 복사본을 수정하거나 이동하기 위해 수행된다.
1. Object.MemberwiseClone() 방법
그만큼 Object.MemberwiseClone() 메서드를 사용하여 현재 개체의 얕은 복사본을 만들 수 있다. 참조 딥 카피를 구현하려면 MemberwiseClone() 방법.
using System;
public class X
{
public string str;
public object Clone() {
return this.MemberwiseClone();
}
}
public class Example
{
public static void Main()
{
X obj = new X();
obj.str = "Hello!";
X copy = (X) obj.Clone();
Console.WriteLine(copy.str);
}
}
/*
결과: Hello!
*/
2. 복사 생성자
복사 생성자는 동일한 클래스의 다른 인스턴스를 가져와서 개체를 복사할 때 컴파일러의 동작을 정의한다. 복사 생성자 구현은 새 개체를 만들고 변경할 수 없는 형식의 값을 복사하여 클래스의 모든 참조 개체에 대해 전체 복사를 수행해야 한다.
using System;
public class X
{
public string str;
public X() {}
// 복사 생성자
public X(X other) {
this.str = other.str;
}
// 팩토리 복사
public static X GetInstance(X x) {
return new X(x);
}
}
public class Example
{
public static void Main()
{
X obj = new X();
obj.str = "Hello!";
X copy1 = new X(obj);
Console.WriteLine(copy1.str);
X copy2 = X.GetInstance(obj);
Console.WriteLine(copy2.str);
}
}
3. 딥클론
다음 코드 예제는 BinaryFormatter를 통해 심층 복제를 구현하는 방법을 보여준다. Serialize() 그리고 Deserialize() 행동 양식. 이것이 작동하려면 클래스를 직렬화 가능으로 표시 해야한다. [Serializable].
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class X {
public string str;
}
public static class Extensions
{
public static T DeepClone<T>(this T obj)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Position = 0;
return (T) formatter.Deserialize(stream);
}
}
}
public class Example
{
public static void Main()
{
X obj = new X();
obj.str = "Hello!";
X copy = obj.DeepClone();
Console.WriteLine(copy.str);
}
}
/*
결과: Hello!
*/
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# 문자열 배열을 int 배열로 변환 (0) | 2023.06.16 |
---|---|
C# Equals, ==, ReferenceEquals 비교 (0) | 2023.06.14 |
C# 문자열 자르기(Split), 추출(Substring) (0) | 2023.06.13 |
C# 문자열 공백 기준으로 분할 (0) | 2023.06.13 |
C# _ Discard (변수 무시) (0) | 2023.06.07 |