Wątek przeniesiony 2015-05-24 20:42 z C# i .NET przez somekind.

Jakie IDE wybrać do robienia okienek w C#?

0

Jakie IDE wybrać do robienia okienek w C#. Chciałbym sam naisać kod, no tylko może mi podstawy napisać.
W czym właściwie pisze się okienka w C# ?
No i jak jest ze wskażnikami ? Tak jak w C++ czy tak jak w Java ?

0
Xix napisał(a):

Jakie IDE wybrać do robienia okienek w C#

Pytasz jakbyś miał jakiś wybór :D Do WPF możesz używać Blenda, do WinForms narzędzi wbudowanych w Visual Studio.

Xix napisał(a):

No i jak jest ze wskażnikami ? Tak jak w C++ czy tak jak w Java ?

Jak w Java.

0
Xix napisał(a):

No i jak jest ze wskażnikami ? Tak jak w C++ czy tak jak w Java ?

trochę jak w c++ (unsafe), trochę jak java a najbardziej jak c#

0

Czyli jak wpisuje:
funkcja(coś)
{
coś = 10;

}
to coś poza funkcją = 10 ?

0

jeżeli parametr będzie przekazany jako ref lub out

0

Nie.

0

What ?
Ref ?
Out ?
To chyba z C++ ale ja z YT się uczyłem a tam o bibliotece VCL więc może jestem zacofany...

0

w C# nie ma typowych wskaźników. Są uchwyty. Zmienne typów podstawowych czyli int, float itp trzymają wartość, natomiast każdy typ wbudowany czy własny typ, nie trzyma wartości tylko jest uchwytem (czyt. wskaźnikiem) ale to tam ciebie nie obchodzi, nie martwisz się o to praktycznie nigdzie. Czemu tak jest? A no bo działa GC (odśmiecacz) ty kasując zmienną kasujesz uchwyt do niej. Wtedy idzie taki GC i jeżeli widzi, że jakaś wartość nie ma nigdzie uchwytu do siebie to ją kasuje.

0

To jak ten uchwyt stworzyć ?

0
String test = "gfddfsdfsd";

...i już masz uchwyt do ciągu znaków :p

0

Ludzie, jakie uchwyty?

Są typy wartościowe (bool, liczbowe, enum i struct) oraz referencyjne (większość pozostałych). Każdy z nich działa tak, jak mówi jego nazwa, czyli wartościowe przekazywane są przez wartość, a referencyjne przez referencje.

Wskaźniki to odrębny mechanizm służący do mazania po pamięci bez zabezpieczenia i właściwie rzadko kiedy się ich używa.

0

No to ja się poddaję. To co z tym wskaźnikami. W Java referencja, tak ? No to w funkcji to ref ma być ?

0

W Javie wszystko przekazywane jest przez wartość, która jest albo referencją (wskaźnikiem) do obiektu, albo wartością typu prymitywnego.

Zeszliśmy na jakieś głębsze dywagacje, nie przejmuj się tym. ref będziesz rzadko potrzebował, a na pewno nie teraz. Przekazuj normalnie i nie przejmuj się tym, w końcu po coś masz automatyczne zarządzanie pamięcią w tych językach.

6

To co z tym wskaźnikami.

C# jest pod tym względem dość skomplikowany.

Są typy referencyjne i wartościowe. Do pierwszych należą klasy (class), do drugich struktury (struct) i typy proste.

Zmienna typu referencyjnego (klasy) jest uchwytem na właściwy obiekt. Do funkcji przekazywany jest ten uchwyt. Kopia obiektu nie jest robiona.
Działa to tak jak klasy w Javie.

void foo(Klasa k)
{
    k.x = 3;
    k = new Klasa();
}

Pierwsza linijka z k.x = 3 ma skutek widoczny poza funkcją foo: wartość pola się zmieni.
Druga linijka utworzy nowy obiekt, ale k jest tylko uchwytem (kopią uchwytu), więc na zewnątrz funkcji nie będzie dostępu do nowego obiektu, pozostanie stary. Nowy obiekt zostanie zabrany przez GC, jeśli nie istnieje doń żaden inny uchwyt.

Same uchwyty są domyślnie przekazywane przez wartość, stąd wewnątrz funkcji mamy do czynienia z kopią tegoż uchytu. Można też uchwyt przekazać przez referencję, przy użyciu słów ref albo out:

void foo(ref Klasa k)
{
    k = new Klasa();
}

W tym przypadku nowy obiekt zostanie przypisany oryginalnej zmiennej którą przekazano funkcji. Funkcję trzeba też wywołać ze słowem ref:

Klasa k = new Klasa();
foo(ref k);

Drugi rodzaj typów to typy wartościowe. Przekazywane są przez wartość. Dotyczy to przede wszystkim typów prostych (jak int), ale też struktur (struct).

void bar(Struktura s)
{
    s.x = 3;
    s = new Klasa();
}

Ani pierwsza, ani druga linijka nie ma skutku widocznego poza funkcją, bo operuje na kopii struktury. s jest całym obiektem, a nie tylko uchwytem czy referencją.
Można jednak strukturę albo inta przekazać przez ref albo out:

void bar(ref Struktura s, out int i)
{
    s = new Klasa();
    i = 42;
}

Jak wyżej, słów ref/out trzeba też użyć w wywołaniu:

int a;
Struktura s = new Struktura();
bar(ref s, out a);

C# posiada również prawdziwe wskaźniki, o składni podobnej do C++ i takim działaniu. ```csharp int i; int* p = &i;

*p = 42;
Console.WriteLine(i); // 42

Wskaźników można używać tylko gdy użyto słowa `unsafe`, w nagłówku funkcji albo jako osobny blok:
```csharp
unsafe void baz()
{
    /* wskaźniki dozwolone */
}

void ala()
{
   unsafe
   {
        /* wskaźniki dozwolone */
   }
}

Obsługa "unsafe" musi być też być włączona w opcjach projektu.
Normalnie nie używa się wskaźników w C#. Nigdy nie są niezbędne, ale są przydatne gdy mamy do czynienia z biblioteką natywną (np. w C/C++) która operuje na wskaźnikach, pozwalają też na znaczne przyspieszenie czasochłonnych operacji na dużych ilościach danych (np. obróbka grafiki i dźwięku) - dereferencja wskaźnika jest szybsza niż indeksowanie tablicy, bo nie jest sprawdzana poprawność indeksów.

Z tego ostatniego powodu operacje na wskaźnikach są „niebezpieczne”, bo pozwalają na mazanie po pamięci, włączając w to inne obiekty. Dlatego należą do grupy operacji „unsafe”, i powinno się ich używać tylko kiedy się wie co się robi.

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