C# Language
.NET의 안전하지 않은 코드
수색…
비고
- .Net 프로젝트에서
unsafe
키워드를 사용할 수 있으려면 프로젝트 속성 => 빌드에서 "안전하지 않은 코드 허용"을 선택해야합니다 - 안전하지 않은 코드를 사용하면 성능을 향상시킬 수 있지만 코드 안전성을 희생합니다 (따라서
unsafe
용어).
예를 들어 for 루프를 사용하면 다음과 같은 배열이됩니다.
for (int i = 0; i < array.Length; i++)
{
array[i] = 0;
}
.NET Framework는 배열의 경계를 초과하지 않도록하여 인덱스가 경계를 초과하는 경우 IndexOutOfRangeException
던집니다.
그러나 안전하지 않은 코드를 사용하면 다음과 같이 배열의 범위를 초과 할 수 있습니다.
unsafe
{
fixed (int* ptr = array)
{
for (int i = 0; i <= array.Length; i++)
{
*(ptr+i) = 0;
}
}
}
안전하지 않은 배열 인덱스
void Main()
{
unsafe
{
int[] a = {1, 2, 3};
fixed(int* b = a)
{
Console.WriteLine(b[4]);
}
}
}
이 코드를 실행하면 길이가 3 인 배열이 만들어 지지만 다섯 번째 항목 (인덱스 4)을 얻으려고합니다. 내 컴퓨터에서는 1910457872
인쇄되었지만 동작은 정의되지 않았습니다.
unsafe
블록이 없으면 포인터를 사용할 수 없으므로 예외가 throw되지 않고 배열의 끝을지나 값에 액세스 할 수 없습니다.
안전하지 않은 배열 사용
포인터로 배열에 액세스 할 때 경계 검사가 없으므로 IndexOutOfRangeException
이 발생하지 않습니다. 이것은 코드를 더 빠르게 만듭니다.
포인터를 사용하여 배열에 값 지정 :
class Program
{
static void Main(string[] args)
{
unsafe
{
int[] array = new int[1000];
fixed (int* ptr = array)
{
for (int i = 0; i < array.Length; i++)
{
*(ptr+i) = i; //assigning the value with the pointer
}
}
}
}
}
안전하고 정상적인 상대는 다음과 같습니다 :
class Program
{
static void Main(string[] args)
{
int[] array = new int[1000];
for (int i = 0; i < array.Length; i++)
{
array[i] = i;
}
}
}
안전하지 않은 부분은 일반적으로 빠르며 성능의 차이는 어레이의 요소의 복잡성과 각 요소에 적용된 논리에 따라 달라질 수 있습니다. 비록 더 빨라질지라도, 유지하기가 더 어려워지기 쉬우므로 조심해서 사용해야합니다.
안전하지 않은 문자열 사용
var s = "Hello"; // The string referenced by variable 's' is normally immutable, but
// since it is memory, we could change it if we can access it in an
// unsafe way.
unsafe // allows writing to memory; methods on System.String don't allow this
{
fixed (char* c = s) // get pointer to string originally stored in read only memory
for (int i = 0; i < s.Length; i++)
c[i] = 'a'; // change data in memory allocated for original string "Hello"
}
Console.WriteLine(s); // The variable 's' still refers to the same System.String
// value in memory, but the contents at that location were
// changed by the unsafe write above.
// Displays: "aaaaa"
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow