Forum: PC-Programmierung ValueTyp Struktur CSharp


von Eric (Gast)


Lesenswert?

Hallo, bin Neuling in C#
1
 static int hingabe(int i,ValueType x)
2
        {
3
           
4
5
            if (i == 1)
6
            {
7
                int a = 2;
8
9
                //int z = x.z;
10
                return a;
11
            }
12
            else
13
            {
14
                int b = 2;
15
                return b;
16
            }
17
18
        }

ValueType x ist eine Struktur, Struktur enthält integer z

Wie kann ich auf z zugreifen
Leider ist es nicht so leicht, wie ich dachte

von Sven H. (dsb_sven)


Lesenswert?

Ich seh nichts, was nicht gehen sollte.

Stell mal ein bisschen mehr Quelltext zur Verfügung...

int z = x.z;  sollte eigentlich funktionieren.

von Eric (Gast)


Lesenswert?

Hauptprogramm
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
6
namespace ConsoleApplication1
7
{
8
    
9
10
11
    class Program
12
    {
13
14
15
       
16
17
18
        struct datu
19
        {
20
            public int a;
21
            public int b;
22
            public int c;
23
        }
24
       
25
26
        static void Main(string[] args)
27
        {
28
            Class1 cl = new Class1();
29
            
30
          
31
            datu dat;
32
            ValueType de = null;
33
34
            
35
            dat.a=1;
36
            dat.b=1;
37
            dat.c=1;
38
39
            de=cl.rueckgabe(2);
40
            int i = (int)cl.hingabe(1,dat);
41
           
42
43
            Console.WriteLine(de);
44
            
45
            Console.WriteLine(dat);
46
            
47
            
48
            Console.ReadKey();
49
50
        }
51
    }
52
}
 Klasse mit Funktionen
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
6
namespace ConsoleApplication1
7
{
8
    class Class1
9
    {
10
11
       public struct data
12
        {
13
        public int a;
14
        public int b;
15
        public int c;
16
        }
17
18
       public ValueType rueckgabe(int i)
19
       {        data dat;
20
                dat.a = 4;
21
                dat.b = 2;
22
                dat.c = 1;
23
                return dat;
24
            
25
            
26
27
        }
28
29
       public ValueType hingabe(int i,ValueType x)
30
       {
31
           Console.WriteLine(x);
32
           return i;
33
       }
34
    }
35
}

So weit geht es noch ohne Fehler. Ich will nun an die Strukturelemente 
a,b,c herankommen. Einmal in der Funktion hingabe und nach der Funktion 
rückgabe

von Peter II (Gast)


Lesenswert?

irgendwie ist dein beispiel Merkwürdig

bei
 public ValueType rueckgabe(int i)

machst du

return dat;

aber dat ist vom Datentype data und nicht ValueType.

bei

public ValueType hingabe

machst du return i; was ein int ist also auch kein ValueType.

Ist das so gewollt?

von Eric (Gast)


Lesenswert?

ja das ist gewollt, ich kann so nämlich z.b. als return wert ein double 
oder int in der selben funktion zurückgeben. nun wollt ich mal versuchen 
ob das für strukturen auch klappt, die gehören ja auch mit zu valuetype. 
ich sehe die variablen in debug-modus ja auch , weiss nur nicht wie ich 
sieh ansprechen kann

von Peter II (Gast)


Lesenswert?

Eric schrieb:
> als return wert ein double
> oder int in der selben funktion zurückgeben
und wozu? andere Personen sind froh wenn sie ein Typisierte sprache zu 
haben und du versucht genau das gegenteil davon zu erreichen.

Etweder macht man 2 funktionen für jeden Datentype den man braucht eine 
oder man verwendet dynamic cast.

von Arc N. (arc)


Lesenswert?

Eric schrieb:
> ja das ist gewollt, ich kann so nämlich z.b. als return wert ein double
> oder int in der selben funktion zurückgeben. nun wollt ich mal versuchen
> ob das für strukturen auch klappt, die gehören ja auch mit zu valuetype.
> ich sehe die variablen in debug-modus ja auch , weiss nur nicht wie ich
> sieh ansprechen kann

Casten...
ValueType ist nur eine spezielle Verpackung (Basisklasse) für 
Wertetypen.
1
public int fn(ValueType v) {
2
    if (!(v is data)) ...
3
    return ((data)x).a;
4
}

von Eric (Gast)


Lesenswert?

>      ((data)x).a;


was bedeutet das genau ? Was ist x

von ... (Gast)


Lesenswert?

Eric schrieb:
> Was ist x

Vermutlich ein Tippfehler, sollte wohl 'v' heißen.

von Eric (Gast)


Lesenswert?

mmh, klappt nicht. kann immer noch nicht zugreifen x ist nie data

von Eric (Gast)


Lesenswert?

auch der typcast geht nicht

von Arc N. (arc)


Lesenswert?

Eric schrieb:
> auch der typcast geht nicht

Der sollte funktionieren
1
public struct data {
2
    public int a;
3
    public int b;
4
    public int c;
5
}
6
7
ValueType fn(ValueType v) {
8
    // data td = (data)v;
9
    // return td.c;
10
    // oder
11
    // int tc = ((data)v).c;
12
    // return tc;
13
    return ((data)v).c;
14
}
15
16
void testfn() {
17
     var t = new data { a = 1, b = 2, c = 3 };
18
     var res = fn(t);
19
}

von asdf (Gast)


Lesenswert?

1. entfern doch bitte unnötige leerzeilen, das erleichtert das lesen 
ungemein

2. gewöhn dir ganz ganz schnell kommentare an. ich mach c.a. alle 10 
zeilen einen. manchmal mehr, manchmal weniger. wenn man die routine 
einmal drin hat, ist das kein problem. und sei es nur "//load data into 
class"
das verständnis für den eigenen code sinkt nämlich exponentiell mit der 
zeit und der menge an code ^^

3. was soll dieses programm denn bezwecken?

4. casten NUR wenn wirklich nötig aber dann auch explizit. ich halt 
davon allgemein nicht so viel.

5. wenn schon generisch dann lieber object. solche spezialsachen wie 
valuetype (das ich auch nicht kenne) braucht man zu 95% eigentlich 
nicht. vor allem nicht, wenn man gerade anfängt.

bin auch kein programmierer von haus aus, lasse mich gerne korrigieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.