Wprowadzenie do wskaźników w C #

Wskaźniki są zdefiniowane jako zmienna, która zawiera adres pamięci innej zmiennej. Wskaźniki w języku C # są używane, gdy istnieje instrukcja, która jest niebezpieczna i jest oznaczona niebezpiecznym słowem kluczowym. Tego typu instrukcje nie kontrolują śmieciarek i używają zmiennych wskaźnikowych.

Składnia: Wskaźniki można zadeklarować jako

type *var name;
int* a;

Tutaj * nazywa się operatorem usuwania odniesienia, a a jest zmienną zawierającą adres typu int.

Przykład

int *p = & x; // where &x is the memory address of x
Console.WriteLine((int)p) // displaying memory address
Console.WriteLine(*p) // displaying value at memory address

Jak działają wskaźniki w języku C #?

Poniżej znajdują się przykłady, które pokazują, jak to działa w języku C #.

Wskaźniki w C # - Przykład nr 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public void Method()
(
unsafe
(
int a = 40;
int b = 20;
int* ptr1 = &a;
int* ptr2 = &b;
Console.WriteLine(*ptr1); // displaying the value
Console.WriteLine(*ptr2); // displaying the value
Console.WriteLine((int)ptr1); // displaying the address
Console.WriteLine((int)ptr2); // displaying the address
)
)
)
class Example
(
// main method
public static void Main()
(
Demo d = new Demo();
d.Method();
)
)
)

Istnieją różne sposoby wykonywania instrukcji jako niebezpieczne, takie jak modyfikator, konstruktor itp. W powyższym przykładzie grupa instrukcji jest oznaczona jako niebezpieczna. W powyższym kodzie są dwie zmienne aib o wartościach odpowiednio 40 i 20, a wskaźniki zawierają ich adresy. Console.WriteLine () służy do wyświetlania wartości i adresów zmiennych.

Wynik:

Wskaźniki w C # - Przykład 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public unsafe void Method()
(
int a = 50;
int b = 20;
int* ptr1 = &a;
int* ptr2 = &b;
Console.WriteLine(*ptr1); // displaying the value
Console.WriteLine(*ptr2); // displaying the value
Console.WriteLine((int)ptr1); // displaying the address
Console.WriteLine((int)ptr2); // displaying the address
)
)
class Example
(
// main method
public static void Main()
(
Demo d = new Demo();
d.Method();
)
)
)

W powyższym przykładzie niebezpieczne jest używane w metodzie, która ma dwie zmienne aib o wartościach odpowiednio 50 i 20. Wskaźniki * ptr1 i * ptr2 wskazują na ich adresy pamięci.

Wynik:

Wskaźniki w C # - Przykład 3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public unsafe static void Main()
(
int() array = ( 10, 20, 30, 40, 50 ); // declaring array
fixed (int* ptr = array) // fixed for pinning the object
/* let us have array address in pointer */
for (int i = 0; i < 5; i++)
(
Console.WriteLine("Value of array((0))=(1)", i, *(ptr + i));
Console.WriteLine("Address of array((0))=(1)", i, (int)(ptr + i));
Console.ReadKey();
)
)
)
)

W powyższym kodzie zdefiniowano tablicę, która składa się z pięciu elementów, a Console.WriteLine () służy do wyświetlania wartości elementów tablicy i adresu elementów tablicy. Istnieje koncepcja w języku C #, która jest znana jako przypinanie obiektu. W powyższym kodzie używana jest stała instrukcja do przypinania obiektów, dzięki czemu śmieciarz nie pozwoli obiektowi się poruszyć i „przypiąć”. Może to wpływać na wydajność środowiska wykonawczego.

Wynik:

Wskaźniki w C # - Przykład 4

using System;
namespace Pointers
(
// Struct employee
struct Employee
(
// members
// employee id and salary
public int empid;
public double salary;
// Constructor to initialize values
public Employee(int e, double s)
(
empid = e;
salary = s;
)
); // end of struct
class Program
(
// Main Method
static void Main(string() args)
(
// unsafe so as to use pointers
unsafe
(
// Declaring two employee Variables
Employee E1 = new Employee(798, 30000);
Employee E2 = new Employee(799, 31000);
// Declaring two employee pointers
// and initializing them with addresses
// of E1 and E2
Employee* E1_ptr = &E1;
Employee* E2_ptr = &E2;
// Displaying details of employees using pointers
// Using the arrow ( -> ) operator
Console.WriteLine("Details of Employee 1");
Console.WriteLine("Employee Id: (0) Salary: (1)",
E1_ptr->empid, E1_ptr->salary);
Console.WriteLine("Details of Employee 2");
Console.WriteLine("Employee Id: (0) Salary: (1)",
E2_ptr->empid, E2_ptr->salary);
) // end unsafe
) // end main
) // end class
)

W powyższym przykładzie struktura pracownika z identyfikatorem pracownika i pensją oraz parametryzacja konstruktora w celu zainicjowania wartości. Wskaźniki wskazują struktury zawierające pierwotny typ wartości zamiast struktur zawierających typ odniesienia. W metodzie głównej istnieją dwie zmienne pracownicze i wskaźniki pracownicze, które są inicjowane adresami E1 i E2. Console.WriteLine () służy do wyświetlania szczegółów pracownika korzystającego ze wskaźników.

Wynik:

Wskaźniki w C # - Przykład 5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public static void Main()
(
unsafe
(
int* arr = stackalloc int(6); // declaring array
arr(0) = 10;
arr(1) = 20;
arr(2) = 30;
arr(3) = 40;
arr(4) = 50;
arr(5) = 60;
for (int i = 0; i < 6; i++)
(
Console.WriteLine($"Value at (i): (arr(i))");
Console.ReadKey();
)
)
)
)
)

W powyższym kodzie użyto słowa kluczowego stackalloc, w którym pamięć jest przydzielana na stosie. Pamięć wykonywana na bloku stosu jest tworzona podczas wykonywania metody. stackalloc ma lepszą wydajność i nie ma potrzeby przypinania tablicy. Jest lepszy niż tablica alokowana na stercie, ponieważ nie trzeba go zwalniać, ponieważ jest automatycznie zwalniany po powrocie metody.

Wynik:

W przypadku wskaźników konwersje mają charakter niejawny i jawny. Domniemany typ konwersji jest jak każdy typ wskaźnika, aby unieważnić * typ, a null dla dowolnego typu wskaźnika. W typie jawnym konwersje są z bajtu, sbyte, ushort, short, uint, int, ulong, long na dowolny typ wskaźnika lub odwrotnie i jeden wskaźnik na inny wskaźnik.

Wniosek - wskaźniki w C #

Tak więc wskaźniki służą do wskazywania adresów pamięci i wykonywania ich przy użyciu niebezpiecznego kodu instrukcji. Jest używany tylko w środowisku niezarządzanym i nie jest śledzony przez moduł wyrzucania elementów bezużytecznych. Wskaźniki są używane w stosie, kolejce itp.

Polecane artykuły

Jest to przewodnik po wskaźnikach w C #. Tutaj omawiamy Wprowadzenie i jak działa wskaźnik w C # wraz z różnymi przykładami. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej-

  1. Zastosowania C #
  2. Wskaźniki w C ++
  3. Wydajność C # a Java
  4. Co to jest C?