C# - Códigos inseguros
C# permite o uso de variáveis de ponteiro em uma função de bloco de código quando marcada pelo inseguro modificador. O código inseguro ou o código não gerenciado é um bloco de código que usa um ponteiro variável.
Ponteiros
Um ponteiro é uma variável cujo valor é o endereço de outra variável, ou seja, o endereço direto da localização da memória. semelhante a qualquer variável ou constante, você deve declarar um ponteiro antes de poder usá-lo para armazenar qualquer endereço de variável.
A forma geral de uma declaração de ponteiro é -
type *var-name;
A seguir estão declarações de ponteiro válidas -
int *ip; /* pointer to an integer */ double *dp; /* pointer to a double */ float *fp; /* pointer to a float */ char *ch /* pointer to a character */
O exemplo a seguir ilustra o uso de ponteiros em C#, usando o modificador unsafe −
using System; namespace UnsafeCodeApplication { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} ", var); Console.WriteLine("Address is: {0}", (int)p); Console.ReadKey(); } } }
Quando o código acima foi compilado e executado, ele produz o seguinte resultado -
Data is: 20 Address is: 99215364
Em vez de declarar um método inteiro como inseguro, você também pode declarar uma parte do código como insegura. O exemplo na seção a seguir mostra isso.
Recuperando o valor dos dados usando um ponteiro
Você pode recuperar os dados armazenados no local referenciado pela variável ponteiro, usando o ToString() método. O exemplo a seguir demonstra isso -
using System; namespace UnsafeCodeApplication { class Program { public static void Main() { unsafe { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} " , var); Console.WriteLine("Data is: {0} " , p->ToString()); Console.WriteLine("Address is: {0} " , (int)p); } Console.ReadKey(); } } }
Quando o código acima foi compilado e executado, ele produz o seguinte resultado -
Data is: 20 Data is: 20 Address is: 77128984
Passando ponteiros como parâmetros para métodos
Você pode passar uma variável de ponteiro para um método como parâmetro. O exemplo a seguir ilustra isso -
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe void swap(int* p, int *q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { TestPointer p = new TestPointer(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2); p.swap(x, y); Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Before Swap: var1: 10, var2: 20 After Swap: var1: 20, var2: 10
Acessando elementos de matriz usando um ponteiro
Em C#, um nome de matriz e um ponteiro para um tipo de dados igual aos dados de matriz não são do mesmo tipo de variável. Por exemplo, int *p e int[] p, não são do mesmo tipo. Você pode incrementar a variável de ponteiro p porque ela não é fixa na memória, mas um endereço de matriz é fixo na memória, e você não pode incrementá-la.
Portanto, se você precisar acessar um array de dados usando uma variável de ponteiro, como tradicionalmente fazemos em C ou C++ (por favor, verifique:Ponteiros C), você precisa corrigir o ponteiro usando o fixed palavra-chave.
O exemplo a seguir demonstra isso -
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* let us have array address in pointer */ for ( int i = 0; i < 3; i++) { Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i)); Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i)); } Console.ReadKey(); } } }
Quando o código acima foi compilado e executado, ele produz o seguinte resultado -
Address of list[0] = 31627168 Value of list[0] = 10 Address of list[1] = 31627172 Value of list[1] = 100 Address of list[2] = 31627176 Value of list[2] = 200
Compilando código inseguro
Para compilar código inseguro, você deve especificar o /unsafe opção de linha de comando com compilador de linha de comando.
Por exemplo, para compilar um programa chamado prog1.cs contendo código não seguro, a partir da linha de comando, dê o comando −
csc /unsafe prog1.cs
Se você estiver usando o Visual Studio IDE, precisará habilitar o uso de código não seguro nas propriedades do projeto.
Para fazer isso -
-
Abra as propriedades do projeto clicando duas vezes no nó de propriedades no Solution Explorer.
-
Clique no botão Construir aba.
-
Selecione a opção "Permitir código não seguro ".
Linguagem C
- Códigos de cores do resistor
- Códigos de cores da fiação
- Ponteiros C++ com exemplos
- Ponteiros em C:O que é ponteiro em programação C? Tipos
- C - Ponteiros
- Códigos de matriz de dados versus códigos QR
- Códigos Haas Mill M
- Códigos Mach3 M
- Códigos M – Teste de programação CNC
- Códigos G – Teste de programação CNC