C#에서 가변 문자열과 불변 문자열의 차이점은 무엇입니까?
C#에서 가변 문자열과 불변 문자열의 차이점은 무엇입니까?
가변형과 불변형은 각각 "변화할 수 있다"와 "변화할 수 없다"를 의미하는 영어 단어입니다.단어의 의미는 IT 환경에서 동일합니다.
- 변경 가능한 문자열을 변경할 수 있습니다.
- 불변 문자열은 변경할 수 없습니다.
이 단어들의 의미는 C# /에서 동일합니다.NET은 다른 프로그래밍 언어/환경과 마찬가지로 (분명히) 다른 세부 사항과 마찬가지로 유형의 이름이 다를 수 있습니다.
참고로:
String
C/ . 문자열 입니다. C# / .Net 형식입니다.StringBuilder
C/ . string 입니다. C# / .Net 은 표준입니다.
C#으로 에 "을 적용하려면 "변경"을 지정합니다.String
당신은 실제로 새로운 것을 만듭니다.String
물건. 본원.String
변경되지 않습니다. 변경할 수 없기 때문입니다.
에는 대분의경사것좋다습니이는용하우부다좋을 사용하는 것이 좋습니다.String
다른 스레드가 "내 문자열을 변경"할 가능성을 고려할 필요가 없기 때문입니다.
그러나 일련의 작업을 사용하여 문자열을 구성하거나 수정해야 하는 경우에는 다음을 사용하는 것이 더 효율적일 수 있습니다.StringBuilder
예를 들어 많은 문자열 조각을 연결하여 큰 문자열을 구성하는 경우가 있습니다.
- 을 만당신이순한다면로서대것을의 로 하면,
String
결연, 사복O(N^2)
서 자문, 치N
구성 요소 문자열의 수입니다. - 사용하는 경우
StringBuilder
은 만 합니다.O(N)
성격.
그리고 마지막으로, 그것을 주장하는 사람들에게.StringBuilder
는 불변이 아니기 때문에 문자열이 아닙니다. Microsoft 설명서에서 설명합니다.StringBuilder
따라서:
"변량 가능한 문자열을 나타냅니다.이 클래스는 상속할 수 없습니다."
String
입니다.
즉, 문자열은 변경할 수 없습니다.문자열을 변경할 때(예를 들어 문자열에 추가) 실제로 새 문자열을 만드는 것입니다.
그렇지만StringBuilder
가변적입니다.
여러 연결과 같이 문자열을 여러 번 변경해야 하는 경우 다음을 사용합니다.StringBuilder
.
개체가 생성되면 개체에 대한 다양한 작업을 호출하여 상태를 변경할 수 있고, 그렇지 않으면 개체가 변경되지 않을 경우 개체가 변경될 수 있습니다.
불변 문자열
C#(및 .)에서.NET) 문자열은 시스템 클래스로 표시됩니다.. 그.string
키워드는 이 클래스의 별칭입니다.
시스템.문자열 클래스는 변경할 수 없습니다. 즉, 한 번 생성된 문자열 클래스의 상태는 변경할 수 없습니다.
그서당문신에서수행자모하는같든다습다니음작과와 같은 문자열에 대해 작업을 .Substring
,Remove
,Replace
을 사용하여 새+' 연산자 등을 사용하여 연결하면 새 문자열이 생성되어 반환됩니다.
시연은 다음 프로그램을 참조하십시오.
string str = "mystring";
string newString = str.Substring(2);
Console.WriteLine(newString);
Console.WriteLine(str);
그러면 'string'과 'mystring'이 각각 인쇄됩니다.
불변성의 이점과 문자열이 불변하는 이유에 대해서는 Why를 선택합니다.NET 문자열은 불변입니까?
가변 문자열
, 을 사용하면 됩니다.StringBuilder
클래스. 에 대한 작업 StringBuilder
인스턴스가 동일한 개체를 수정합니다.
사용 시기에 대한 자세한 정보를 보려면 다음과 같이 하십시오. StringBuilder
String Builder를 사용해야 하는 경우를 참조하십시오.
든모.string
개체는 C#에서 불변합니다.의 string
생성된 값은 구성된 값 이외의 값을 나타낼 수 없습니다.문자열을 "변경"하는 것처럼 보이는 모든 작업은 대신 새 문자열을 생성합니다.이것은 메모리에서는 비효율적이지만 참조를 변경하지 않는 한 참조되는 문자열은 변경되지 않으므로 문자열이 사용자 아래에서 형식을 변경하지 않을 것이라고 신뢰할 수 있다는 점에서 매우 유용합니다.
대조적으로, 가변 객체는 변경할 수 있는 데이터 필드를 가집니다.메서드 중 하나 이상이 개체의 내용을 변경하거나 속성을 가지고 있으며, 이 속성은 개체에 기록될 때 개체의 값을 변경합니다.
- 은 - String입니다.StringBuffer
그리고 나서 당신은 그것이 당신 밑에서 변하지 않을 것을 확실히 하고 싶다면 그것을 복사해야 합니다.이것이 바로 가변 물체가 어떤 형태로든 키로 사용하기에 위험한 이유입니다.Dictionary
또는 설정 - 개체 자체가 변경될 수 있으며 데이터 구조를 알 수 없는 경우 데이터가 손상되어 프로그램이 손상될 수 있습니다.
그러나 내용을 변경할 수 있으므로 단일 문자 또는 유사한 문자를 변경하기 위해 전체 복사본을 만드는 것보다 훨씬 더 메모리 효율적입니다.
일반적으로 올바른 방법은 무언가를 만들 때는 가변 객체를 사용하고, 끝나면 불변 객체를 사용하는 것입니다.물론 이것은 불변의 형태를 가진 물체에 적용되지만 대부분의 컬렉션은 그렇지 않습니다.그러나 컬렉션의 내부 상태를 다른 컨텍스트로 전송할 때는 불변의 상태인 읽기 전용 형식의 컬렉션을 제공하는 것이 유용한 경우가 많습니다. 그렇지 않으면 무언가가 해당 반환 값을 가져가서 데이터를 손상시킬 수 있습니다.
불변:
개체에 대해 일부 작업을 수행하면 새 개체가 생성되므로 문자열의 경우처럼 상태를 수정할 수 없습니다.
무터블
개체에 대해 일부 작업을 수행할 때 StringBuilder의 경우와 같은 새 개체가 생성되지 않도록 개체 자체가 수정되었습니다.
.NET 시스템에서.문자열(일명 문자열)은 변경할 수 없는 개체입니다.즉, 개체를 만들 때 개체의 값을 나중에 변경할 수 없습니다.변경할 수 없는 개체만 재생성할 수 있습니다.
시스템. 텍스트.StringBuilder는 시스템과 동일한 변수입니다.문자열 값을 변경할 수 있습니다.
예:
class Program
{
static void Main(string[] args)
{
System.String str = "inital value";
str = "\nsecond value";
str = "\nthird value";
StringBuilder sb = new StringBuilder();
sb.Append("initial value");
sb.AppendLine("second value");
sb.AppendLine("third value");
}
}
다음 MSIL 생성 : 코드를 조사하는 경우.시스템 개체를 변경할 때마다 이 메시지가 표시됩니다.실제로 새 문자열을 만들고 있는 문자열입니다.하지만 시스템에서.Text.StringBuilder는 텍스트 값을 변경할 때마다 개체를 다시 만들지 않습니다.
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 62 (0x3e)
.maxstack 2
.locals init ([0] string str,
[1] class [mscorlib]System.Text.StringBuilder sb)
IL_0000: nop
IL_0001: ldstr "inital value"
IL_0006: stloc.0
IL_0007: ldstr "\nsecond value"
IL_000c: stloc.0
IL_000d: ldstr "\nthird value"
IL_0012: stloc.0
IL_0013: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor()
IL_0018: stloc.1
IL_0019: ldloc.1
IL_001a: ldstr "initial value"
IL_001f: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
IL_0024: pop
IL_0025: ldloc.1
IL_0026: ldstr "second value"
IL_002b: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::AppendLine(string)
IL_0030: pop
IL_0031: ldloc.1
IL_0032: ldstr "third value"
IL_0037: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::AppendLine(string)
IL_003c: pop
IL_003d: ret
} // end of method Program::Main
문자열은 다음과 같은 이유로 변경할 수 있습니다.NET은 장면 뒤에 문자열 풀을 사용합니다.의미:
string name = "My Country";
string name2 = "My Country";
name과 name2가 모두 문자열 풀의 동일한 메모리 위치를 참조하고 있습니다.이제 name2를 다음으로 변경한다고 가정합니다.
name2 = "My Loving Country";
문자열 "My Loving Country"에 대한 문자열 풀을 조사합니다. 그렇지 않으면 문자열 풀에 새 문자열 "My Loving Country"가 생성되고 name2가 이 문자열 풀을 참조합니다.그러나 이름과 같은 다른 변수가 여전히 사용하고 있기 때문에 이 전체 프로세스 "내 국가"는 변경되지 않았습니다.그리고 그것이 끈이 불변인 이유입니다.
StringBuilder는 다른 방식으로 작동하며 문자열 풀을 사용하지 않습니다.StringBuilder의 인스턴스를 만드는 경우:
var address = new StringBuilder(500);
이 인스턴스에 500바이트 크기의 메모리 청크를 할당하고 모든 작업을 수행하면 이 메모리 위치만 수정하고 다른 개체와 공유되지 않습니다.이것이 String Builder가 MUTABLE인 이유입니다.
도움이 되길 바랍니다.
사실, 없습니다.String 클래스는 변경할 수 있습니다.
unsafe
{
string foo = string.Copy("I am immutable.");
fixed (char* pChar = foo)
{
char* pFoo = pChar;
pFoo[5] = ' ';
pFoo[6] = ' ';
}
Console.WriteLine(foo); // "I am mutable."
}
이러한 논리는 String 및 String Builder 클래스에서 항상 수행됩니다.Concat, Substring 등을 호출할 때마다 새 문자열을 할당하고 포인터 산술을 사용하여 새 문자열로 복사합니다.현은 스스로 돌연변이를 일으키지 않기 때문에 "불변"으로 간주됩니다.
참고로 문자열 리터럴로 시도하지 마십시오. 그렇지 않으면 프로그램을 엉망으로 만들 수 있습니다.
string bar = "I am a string.";
fixed (char* pChar = bar)
{
char* pBar = pChar;
pBar[2] = ' ';
}
string baz = "I am a string.";
Console.WriteLine(baz); // "I m a string."
이는 문자열 리터럴이 데스크톱에 내장되어 있기 때문입니다. Framework Framework »,bar
그리고.baz
동일한 문자열을 가리키기 때문에 하나를 돌연변이로 만들면 다른 하나가 돌연변이가 됩니다.그러나 문자열 인터닝이 없는 WinRT와 같은 관리되지 않는 플랫폼을 사용하는 경우에는 이 모든 것이 문제가 되지 않습니다.
데이터 값은 변경할 수 없습니다.참고: 변수 값은 변경될 수 있지만 원래의 불변 데이터 값은 삭제되고 메모리에 새 데이터 값이 생성되었습니다.
명확하게 하기 위해 C#(또는 )에는 변형 가능한 문자열이 없습니다.NET 일반).다른 언어는 변경 가능한 문자열(변경 가능한 문자열)을 지원하지만,NET 프레임워크는 그렇지 않습니다.
그래서 당신의 질문에 대한 정답은 모든 문자열이 C#에서 불변이라는 것입니다.
문자열에 특정 의미가 있습니다."string" 소문자 키워드는 시스템에서 인스턴스화된 개체에 대한 바로 가기일 뿐입니다.문자열 클래스.문자열 클래스에서 생성된 모든 개체는 항상 불변입니다.
텍스트를 변형 가능하게 표현하려면 StringBuilder와 같은 다른 클래스를 사용해야 합니다.StringBuilder를 사용하면 '단어' 모음을 반복적으로 작성한 다음 문자열로 변환할 수 있습니다(다시 한 번 변경할 수 없음).
시행세부로
CLR2의 시스템.문자열은 변경할 수 있습니다.StringBuilder.호출 문자열을 추가합니다.제자리에 추가(개인 메서드)
CLR4의 시스템.문자열은 변경할 수 없습니다.StringBuilder에 청킹이 있는 문자 배열이 있습니다.
출처: http://yassershaikh.com/what-is-the-difference-between-strings-and-stringbuilder-in-c-net/
단답: 문자열은 불변인 반면 String Builder는 불변입니다.
그게 무슨 의미죠?Wiki에서 말하기를: 객체 지향에서 불변 객체는 만들어진 후 상태를 수정할 수 없는 객체입니다.이는 개체를 만든 후 수정할 수 있는 가변 개체와 대조적입니다.
String Builder 클래스 설명서에서 다음을 수행합니다.
String 개체는 변경할 수 없습니다.시스템에서 메소드 중 하나를 사용할 때마다 선택합니다.문자열 클래스: 메모리에 새 문자열 개체를 만들면 해당 새 개체에 대한 공간을 새로 할당해야 합니다.
문자열을 반복적으로 수정해야 하는 상황에서는 새 String 개체를 만드는 것과 관련된 오버헤드가 많이 발생할 수 있습니다.
시스템.Text.StringBuilder 클래스는 새 개체를 만들지 않고 문자열을 수정하려는 경우에 사용할 수 있습니다.예를 들어 StringBuilder 클래스를 사용하면 여러 문자열을 루프에 연결할 때 성능이 향상될 수 있습니다.
다음은 불변 문자열 및 가변 문자열 작성기의 예입니다.
Console.WriteLine("Mutable String Builder");
Console.WriteLine("....................................");
Console.WriteLine();
StringBuilder sb = new StringBuilder("Very Good Morning");
Console.WriteLine(sb.ToString());
sb.Remove(0, 5);
Console.WriteLine(sb.ToString());
Console.WriteLine();
Console.WriteLine("Immutable String");
Console.WriteLine("....................................");
Console.WriteLine();
string s = "Very Good Morning";
Console.WriteLine(s);
s.Substring(0, 5);
Console.WriteLine(s);
Console.ReadLine();
C#의 문자열은 변경할 수 없습니다.문자열과 연결하면 실제로 새 문자열, 즉 새 문자열 개체를 만드는 것입니다! 그러나 StringBuilder는 변형 가능한 문자열을 만듭니다.
StringBuilder는 변경 가능한 문자열 유형이고 StringBuilder 개체는 변경할 수 없는 유형이므로 StringBuilder는 큰 데이터 문자열을 병합하는 동안 새 개체 인스턴스를 만들지 않습니다.
연결을 위해 StringBuilder 대신 string을 사용하는 경우 메모리에 매번 새 인스턴스가 생성됩니다.
언급URL : https://stackoverflow.com/questions/4274193/what-is-the-difference-between-a-mutable-and-immutable-string-in-c
'code' 카테고리의 다른 글
AppCompat v7 r21이 values.xml에서 오류를 반환합니까? (0) | 2023.07.27 |
---|---|
JavaScript를 사용하여 브라우저 언어를 가져오는 방법 (0) | 2023.07.27 |
웹 작업자가 할 수 없는 서비스 작업자가 할 수 있는 일은 무엇입니까? (0) | 2023.07.27 |
하이픈/대시를 사용한 MariaDB 전체 텍스트 검색 (0) | 2023.07.27 |
ASC가 아닌 것을 제거하려면 어떻게 해야 합니까?II 문자는 마침표와 공백을 남깁니다. (0) | 2023.07.22 |