c# a wskaźniki

0

Hej, jestem nowy w c# i mam mały problem.

Kiedyś ucząc się c++ nie mogłem za nic pojąć wskaźników, lecz teraz pracując nad projektem w c# ich wykorzystanie byłoby wskazane.

Czy c# posiada coś, co jest w stanie przechowywać adresy do zmiennych/tablic?

0

W zasadzie można by prawie zgodnie z prawdą powiedzieć że C# nie posiada niczego co by wskaźników nie przechowywało gdyż wszystko jest obiektem. Jak zadeklarujesz tablicę, to jest to zmienna referencyjna - jakby wskaźnik.

0

Częściowo masz rację, jednak jest to bardzo ważne zagadnienie w C# i warto się w to zagłębić.

Do autora: pierw radzę zobaczyć jaka jest różnica między Value types i Reference types jeśli chodzi o C#. Później poczytaj jak działa GC (garbage collector) oraz o przekazywaniu typów z słowem "ref" jako parametry funkcji.

... a na końcu wskaźniki. Te są oczywiście możliwe w C#, z przełącznikiem unsafe - tak zwany "kod niebezpieczny" ;-)

Przykład:

unsafe public static void Swap(int* pi, int* pj)
{
int tmp = *pi;
*pi = *pj;
*pj = tmp;
}
0

a do czego ci te wskazniki?
bo jesli do implementacji list to C# ma je zaimplementowane chyba

0
matra napisał(a)

a do czego ci te wskazniki?
bo jesli do implementacji list to C# ma je zaimplementowane chyba

Dobry żart ;-)

0

Np, czasem chciałoby sie użuyć tablicy do przechowywania wskaźników na tablicę, aby te kolekcje mieć jakoś ogarnięte

Ale pytałem też z czystej Ciekawości

0

</quote>Dobry żart ;-)</quote>

Jak to? W php nawet jest, to chyba c# tym bardziej?

0

elviss jesli chcesz miec wszystkie rozne tablice w jednej to stworz ta tablice glowna jako tablice typu object, pod nia mozesz inne tablice smialo wsadzac :) Wskazniki w C# to tylko przy pracy z kodem niezazadzalnym, acz i tam wtedy lepiej pobawic sie w Marshaling i uzywac IntPtr ale to juz inna bajka :)

0

W C# nie ma potrzeby uzycia wskaznikow. Proba ich wykorzystania jest oznaka niezrozumienia kodu zarzadzanego z garbage collectorem i referencjami (lub dzialaniem celowym, ale do tego trzeba miec wiedze i swiadomosc).

Przykladowo, jesli chcialbys zdefiniowac liste samodzielnie, kazdy element listy moglby byc obiektem, trzymajacym referencje na obiekt nastepny (referencje, ale nie wskaznik!). Korzen owej listy bylby referencja na pierwszy obiekt. Przypisanie null do korzenia listy (przy zalozeniu, ze nie masz innych referencji na owa liste), pozwoli garbage collector'owi na podjecie decyzji o usunieciu obiektow listy.

Traktuj wskazniki jako prymitywne referencje. Referencje w C# oferuja znacznie ciekawszy mechanizm, niz tylko przechowanie, liczby odpowiadajacej adresowi danych w pamieci; mechanizm ten daje bezpieczenstwo typow czy "reference counting", wiazacy sie z zastosowaniem gargabe collector'a.

0

podczepię się pod temat bo bardzo mnie nuży pytanie : jak można niby napisac taką swoją listę w c# bez wskaźników tylko przez referencje ?;>
nie kumam kompletnie...;/

0
using System;

namespace ListSample
{
	public class Element
	{
		public Element Next { get; set; }
		public String Value { get; set; }

		public Element(String value)
		{
			Value = value;
		}
	}

	public class Program
	{
		static void Main(string[] args)
		{
			Element root = new Element("root");
			Element first = new Element("1st");
			root.Next = first;
			Element second = new Element("2nd");
			first.Next = second;
			Element third = new Element("3rd");
			second.Next = third;
			Element fourth = new Element("4th");
			third.Next = fourth;
			// Output
			Element element = root;
			while (element != null)
			{
				Console.WriteLine(element.Value);
				element = element.Next;
			}
			Console.ReadKey();
		}
	}
}

Wyjscie konsoli:

root
1st
2nd
3rd
4th
0

dzięki wielkie Szczawik, w te wakacje zacząłem grzebac w C# i nie mogłem tego pojąc, a teraz to jest oczywiste.... sry za głupie pytanie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1