Przekazywanie zmiennych ref i val

0

Cześć,

Robię klasę, która rysuje coś na obiektach typu System.Windows.Forms.Panel czyli na zwykłych panelach. W konstruktorze, który wygląda mniej więcej tak:

public IMSimpleGraph(ref System.Windows.Forms.Panel Panel)
        {
            this.Panel = Panel;
           //..............itd
        }

Mam ten panel przekazywany jako referencje, dlatego że - gdybym przekazywał domyślnie to przekazało by mi cały panel (jego kopię), a ja chce operować na panelu, który już jest stworzony. Przynajmniej tak sobie to wydedukowałem.

Mój problem polega na tym, że bez względu czy robie to tak czy domyślnie przez "val" zachowanie całej klasy sie nie zmienia, nawet jak utworzę więcej instancji, tzn. wszystko sie rysuje poprawnie na wszystkich panelach. A nawet jak później coś dorysowuję to jest OK bez względu na to jak przekazałem panel.

Może mi ktoś wytłumaczyć o co chodzi? Bo ja nie za bardzo to rozumiem... Powinny sie czymś różnić te wywołania...

Dzięki za odpowiedź,
Pozdrawiam

0
im napisał(a)

Mam ten panel przekazywany jako referencje, dlatego że - gdybym przekazywał domyślnie to przekazało by mi cały panel (jego kopię), a ja chce operować na panelu, który już jest stworzony. Przynajmniej tak sobie to wydedukowałem.
po prostu źle wydedukowałeś - przy przekazywaniu obiektów tak naprawdę przekazywany jest tylko wskaźnik na dany obiekt a nie tworzona jest jego kopia

0

Przy przekazywaniu obiektów

C# jest całkowicie obiektowy.... czyli przy przekazywaniu czegokolwiek przekazywany jest tylko wskaźnik...czyli "ref" i "val" jest w ogóle nie potrzebne, tak?

0
im napisał(a)

C# jest całkowicie obiektowy.... czyli przy przekazywaniu czegokolwiek przekazywany jest tylko wskaźnik...czyli "ref" i "val" jest w ogóle nie potrzebne, tak?

W C# są dwa rodzaje typów: przekazywane przez wartość i przekazywane przez referencje.
Typy wartościowe to typy proste: bool, int, double, itd, a także struktury i typy wyliczeniowe.
Typy referencyjne to klasy, tablice, interfejsy i delegacje.
Gdy chcesz operować na obiekcie typu przekazywanego przez wartość, a nie na jego kopii, to podajesz go do metody jako parametr ref.
A z val się nigdy nie spotkałem.

0

Dzięki za odpowiedź, teraz rozumiem.

Jeśli chodzi o val - to jest przekazywanie przez wartość.. W C# jest domyślne, a np w VB musisz określić czy jest ByVal czy ByRef. Czyli w C# jak nic nie piszerz to przekazujesz przez wartość.

Pozdrawiam,
I.

0

Czyli w C# jak nic nie piszesz to przekazujesz przez wartość.

Tak - ale tylko! typy proste - nie referencyjne (klasy itd).

0

Nie tylko typy proste, struktury także.

0

Nie tylko typy proste, struktury także.

Struktura jest typem prostym.

0
Deti napisał(a)

Tak - ale tylko! typy proste - nie referencyjne (klasy itd).

KrystianD napisał(a)

Nie tylko typy proste, struktury także.

Dla ścisłości, wszystko to co wywodzi się z System.ValueType

0
Deti napisał(a)

Nie tylko typy proste, struktury także.

Struktura jest typem prostym.
Jednak ma pewne cechy klasy podobnie jak string, np. zawsze może przyjąć wartość null. Tak naprawdę to struktury są klasami, które udają typy proste. Przekazywane są przez referencje, ale zachowują się tak, jakby były przekazywane przez wartość i tak je trzeba traktować. "na zewnątrz" struktur używamy jak typów prostych (oprócz wspomnianej cechy - możliwości przyjęcia wartości null bez kapsułkowania). Aaaa, struktury mają jeszcze jedną cechę klas, domyślna wartość struktury to null, a nie obiekt utworzony domyślnym konstruktorem.

struct s{ int i; } 
int I;
s S;
s T = new s();

I ma domyślną wartość 0. S ma wartość null. T jest już zainicjowaną domyślnie strukturą.

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