Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Die Artikel ::  Einführung in C# .Net     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Polofreak
Autor

Benutzerprofil
Anmeldungsdatum: 10.03.2005
Beiträge: 2118
Beitrag Polofreak Autor 11:55:10 13.06.2006   Titel:   Einführung in C# .Net            Zitieren

Einführung in C#.NET

1. Übersicht
2. Typen
3. Enumerationen (Enums)
4. Felder (Arrays)
5. Boxing & Unboxing
6. Overflow Checks
7. Deklarationen
8. Anweisungen (Statements)
9. Klassen und Strukturen
10. Refernz


1 Übersicht

In diesem Artikel möchte ich eine kleine Einführung in C#.NET geben und kurz und bündig erklären, was C#.NET ist; Besonderheiten und Ähnlichkeiten zu anderen Sprachen sind auch mit ein Thema.

Wirklich neu:
• Referenz- und Output-Parameter
• Rectangular Arrays
• Unified type system
• Versionierung

Syntaktische Schönheiten:
• Delegates
• Indexers
• Operator overloading
• foreach-Statements
• Boxing/Unboxing
• Attribute
•...



2 Typen (Types)



Quelle: siehe 10. Referenz


Primitive Datentypen:
Zu den primitiven Datentypen gehören:


Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
primitiver Typ     Long Form        in Java        Range

sbyte               System.SByte     byte           -128 .. 127
byte                System.Byte      ---            0..255
short               System.Int16     short          -32768 .. 32767
ushort              System.UInt16    ---            0 .. 65535
int                 System.Int32     int            -2147483648 .. 2147483647
uint                System.UInt32    ---            0 .. 4294967295
long                System.Int64     long           -263.. 263-1
ulong               System.UInt64    ---            0 .. 264-1
float               System.Single    float          ±1.5E-45 .. ±3.4E38(32 Bit)
double              System.Double    double         ±5E-324 .. ±1.7E308(64 Bit)
decimal             System.Decimal   ---            ±1E-28 .. ±7.9E28 (128 Bit)
bool                System.Boolean   boolean        true,false
char                System.Char      char           Unicodecharacter
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
primitiver Typ Long Form in Java Range

sbyte System.SByte byte -128 .. 127
byte System.Byte --- 0..255
short System.Int16 short -32768 .. 32767
ushort System.UInt16 --- 0 .. 65535
int System.Int32 int -2147483648 .. 2147483647
uint System.UInt32 --- 0 .. 4294967295
long System.Int64 long -263.. 263-1
ulong System.UInt64 --- 0 .. 264-1
float System.Single float ±1.5E-45 .. ±3.4E38(32 Bit)
double System.Double double ±5E-324 .. ±1.7E308(64 Bit)
decimal System.Decimal --- ±1E-28 .. ±7.9E28 (128 Bit)
bool System.Boolean boolean true,false
char System.Char char Unicodecharacter
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
primitiver Typ     Long Form        in Java        Range

sbyte               System.SByte     byte           -128 .. 127
byte                System.Byte      ---            0..255
short               System.Int16     short          -32768 .. 32767
ushort              System.UInt16    ---            0 .. 65535
int                 System.Int32     int            -2147483648 .. 2147483647
uint                System.UInt32    ---            0 .. 4294967295
long                System.Int64     long           -263.. 263-1
ulong               System.UInt64    ---            0 .. 264-1
float               System.Single    float          ±1.5E-45 .. ±3.4E38(32 Bit)
double              System.Double    double         ±5E-324 .. ±1.7E308(64 Bit)
decimal             System.Decimal   ---            ±1E-28 .. ±7.9E28 (128 Bit)
bool                System.Boolean   boolean        true,false
char                System.Char      char           Unicodecharacter


Kompatibilität unter den Typen




Alle Typen sind kompatibel zu "Object". Ebenso können alle Typen Variablen vom Typ Object zugewiesen werden und es sind alle Objekt-Operationen auf sie anwendbar.

Unterschied zwischen Werttypen (value types) und Referenztypen (reference types):

Werttypen:
Werttypen enthalten Werte, die in ihnen gespeichert werden. Sie werden auf dem Stack gespeichert. Bei einer Zuweisung wird der Wert kopiert. Die Initialisierung von Werttypen kann wie folgt aussehen:

C# Code:
int n = 0;
// oder
bool b = false;

//z.B.:
int i = 99;
int j = i;
C# Code:
int n = 0;
// oder
bool b = false;

//z.B.:
int i = 99;
int j = i;
C# Code:
int n = 0;
// oder
bool b = false;

//z.B.:
int i = 99;
int j = i;




Referenztypen:
Im Gegenteil zu Werttypen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert. Bei Zuweisungen wird ebenfalls die Referenz kopiert, keine Werte. Referenzen werden auch nicht auf dem Stack, sondern auf dem Heap gespeichert und werden immer mit null initialisiert.

C# Code:
string s = "cool";
string s1 = s;
C# Code:
string s = "cool";
string s1 = s;
C# Code:
string s = "cool";
string s1 = s;





3 Enumerationen

Liste von namenhaften Konstanten, deren Deklaration direkt im Namespace geschieht.

Beispiel:
C# Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
enum Farbe{rot, gelb, blau, gruen, lila} // hier sind die Variablen automatisch 0, 1, 2...
enum WochenTage_mit_d{dienstag=2,donnerstag=4}
enum WochenTage_mit_d:byte{dienstag=2,donnerstag=4}

//Verwendung:
Farbe c = Farbe.blau;
WochenTage_mit_d WTmd = WochenTage_mit_d.dienstag | WochenTage_mit_d.donnerstag;
if ((WochenTage_mit_d.dienstag & WTmd) != 0)
Console.WriteLine("Wochentag ist mit D!");
C# Code:
1
2
3
4
5
6
7
8
9
enum Farbe{rot, gelb, blau, gruen, lila} // hier sind die Variablen automatisch 0, 1, 2...
enum WochenTage_mit_d{dienstag=2,donnerstag=4}
enum WochenTage_mit_d:byte{dienstag=2,donnerstag=4}

//Verwendung:
Farbe c = Farbe.blau;
WochenTage_mit_d WTmd = WochenTage_mit_d.dienstag | WochenTage_mit_d.donnerstag;
if ((WochenTage_mit_d.dienstag & WTmd) != 0)
Console.WriteLine("Wochentag ist mit D!");
C# Code:
1
2
3
4
5
6
7
8
9
enum Farbe{rot, gelb, blau, gruen, lila} // hier sind die Variablen automatisch 0, 1, 2...
enum WochenTage_mit_d{dienstag=2,donnerstag=4}
enum WochenTage_mit_d:byte{dienstag=2,donnerstag=4}

//Verwendung:
Farbe c = Farbe.blau;
WochenTage_mit_d WTmd = WochenTage_mit_d.dienstag | WochenTage_mit_d.donnerstag;
if ((WochenTage_mit_d.dienstag & WTmd) != 0)
Console.WriteLine("Wochentag ist mit D!");


Was kann man mit Enumerationen machen?
Die Operatoren sind:
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
// Vergleichsoperatoren ==; <=; >=; <; >
if(c == Farbe.blau)//...
if(c > Farbe.gelb && c < Farbe.lila)//...
//weitere sind +; -; ++; --;

c = c+2;
c--;
//oder gleich
c++;
// dann noch &; |;  ~
if ((c & Farbe.rot) == 0)// ...
c = c | Farbe.blau;
c = ~ Farbe.rot;
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
// Vergleichsoperatoren ==; <=; >=; <; >
if(c == Farbe.blau)//...
if(c > Farbe.gelb && c < Farbe.lila)//...
//weitere sind +; -; ++; --;

c = c+2;
c--;
//oder gleich
c++;
// dann noch &; |; ~
if ((c & Farbe.rot) == 0)// ...
c = c | Farbe.blau;
c = ~ Farbe.rot;
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
// Vergleichsoperatoren ==; <=; >=; <; >
if(c == Farbe.blau)//...
if(c > Farbe.gelb && c < Farbe.lila)//...
//weitere sind +; -; ++; --;

c = c+2;
c--;
//oder gleich
c++;
// dann noch &; |;  ~
if ((c & Farbe.rot) == 0)// ...
c = c | Farbe.blau;
c = ~ Farbe.rot;

:warning: Der Compiler prüft nicht, ob der Enum-Typ einen gültigen Wert annimmt.

Enumerationen können Integern nur nach explizitem Cast zugewiesen werden!
Enumerationen erben vom Typ Object, somit: Equals, ToString, ...
Die Klasse System.Enum unterstützt Operationen wie GetName, Format, GetValues, ...

4 Felder (Arrays)

Eindimensionale Arrays:
C# Code:
int[] a = new int[3];
C# Code:
int[] a = new int[3];
C# Code:
int[] a = new int[3];

Mehrdimensionale Felder:
"ausgefranzte":
C# Code:
int[][] ausgefr = new int[5][];
ausgefr[0] = new int[3];
a[1] = new int[4];
C# Code:
int[][] ausgefr = new int[5][];
ausgefr[0] = new int[3];
a[1] = new int[4];
C# Code:
int[][] ausgefr = new int[5][];
ausgefr[0] = new int[3];
a[1] = new int[4];

Solche Felder sind nicht sehr schnell und brauchen mehr Speicher als
rechteckige Felder:
C# Code:
int[,] re = new int[2, 3];
C# Code:
int[,] re = new int[2, 3];
C# Code:
int[,] re = new int[2, 3];

Hier sind die Zugriffe effizienter und die Felder kompakter.


5 Boxing und Unboxing

Boxing ist das Stichwort zur Umwandlung von Structs, Enums oder primitiven Datentypen in ein Objekt. Objekten können somit andere Typen zugewiesen werden. Das könnte dann so aussehen:
C# Code:
int nZahl=5;
object obj = nZahl;
C# Code:
int nZahl=5;
object obj = nZahl;
C# Code:
int nZahl=5;
object obj = nZahl;


Unboxing ist genau das Gegenteil, nämlich aus einem Objekt einen Werttyp machen. Das sieht dann so aus:
C# Code:
int Zahl_aus_obj = (int)obj;
C# Code:
int Zahl_aus_obj = (int)obj;
C# Code:
int Zahl_aus_obj = (int)obj;

und schon hat man aus dem Objekt einen Integer gemacht.

6 Overflow Checks

Standardmäßig werden Overflows nicht abgefangen, somit kann es zu unerwünschtem Verhalten kommen. Da es aber auch sein kann, dass man mit Overflows arbeitet (Zufallszahlen) kann man manuell Overflows abfangen.
C# Code:
int grosse_Zahl = 999999;
grosse_Zahl *= grosse_Zahl;
// ergibt nicht mathematisch richtiges Ergebnis aber auch keinen Fehler

// wenn man es abfangen will, sollte man es besser so machen:

grosse_Zahl = checked(grosse_Zahl*grosse_Zahl);
//wirft OverflowException
C# Code:
int grosse_Zahl = 999999;
grosse_Zahl *= grosse_Zahl;
// ergibt nicht mathematisch richtiges Ergebnis aber auch keinen Fehler

// wenn man es abfangen will, sollte man es besser so machen:

grosse_Zahl = checked(grosse_Zahl*grosse_Zahl);
//wirft OverflowException
C# Code:
int grosse_Zahl = 999999;
grosse_Zahl *= grosse_Zahl;
// ergibt nicht mathematisch richtiges Ergebnis aber auch keinen Fehler

// wenn man es abfangen will, sollte man es besser so machen:

grosse_Zahl = checked(grosse_Zahl*grosse_Zahl);
//wirft OverflowException

Man kann aber nicht nur einzelne Operationen mit checked prüfen, man kann auch ganze Blöcke prüfen:
C# Code:
checked{
grosse_Zahl *= grosse_Zahl;
}
//wirft ebenso Overflow Exception
C# Code:
checked{
grosse_Zahl *= grosse_Zahl;
}
//wirft ebenso Overflow Exception
C# Code:
checked{
grosse_Zahl *= grosse_Zahl;
}
//wirft ebenso Overflow Exception

Wenn man allerdings das komplette Assembly geprüft ausführen will, kann man checked als Compiler-Parameter angeben.
csc /checkedTest.cs

7 Deklarationen

Folgende Grafik soll zeigen, wie Dateneinheiten deklariert werden können.



Variablen sind in niederen Deklarationsräumen verfügbar. Es dürfen somit keine Variablennamen aus höheren verwendet werden, da Namen nicht mehrfach in demselben Deklarationsraum benutzt werden dürfen. Zwei gleichnamige Namensräume in unterschiedlichen Files führen zu einem Deklarationsraum. Dies hat zur Folge, dass Variablen auch in diesen anderen Files verfügbar sind. Andere Namespaces müssen importiert oder spezifiziert werden. So benutzt man z.B. meist
C# Code:
using System;
C# Code:
using System;
C# Code:
using System;


8 Anweisungen (Statements)

Die gelisteten Ausdrücke dürften aus anderen Programmiersprachen bekannt sein, deshalb sind sie nur sehr karg kommentiert. Es soll mehr eine Beispielsammlung sein.

C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//Zuweisungen
z += 58*R;
//Methodenaufrufe
string str = "h.e.l.l.o";
string[] geteilt = s.Split('.');
s = String.Join(" ",geteilt);
//if-Abfragen
if(x>=0 && x<=10)
    x++;
else if (x>=20 && x<=30)
    x +=5;
else
    x=0;
//switch
switch(Font)
{
    case "Überschrift 1": "Heading 1":
        Fontsize = 24;
        break;
    case "Überschrift 2": "Heading 2":
        Fontsize = 20;
        break;
    case null:
        Console.WriteLine("Kein Schema angegeben");
        break;
    default:
        Console.WriteLine("Kenne die Grösse nicht");
        break;
}
//auch gotos sind in switch-Anweisungen möglich

//Schleifen

while (i>n)
{
    sum+=i;
    i--;
}
do
{
    sum += a[ i ];
    i++;
}
while (i<n);

for (int i=0; i<n; i++)
sum+=i;
// Schleife für Arrays (z.B. auch Strings)
int[] x = {1,2,3,4,5,6,7,8,9};
foreach (int z in x) sum +=z;
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//Zuweisungen
z += 58*R;
//Methodenaufrufe
string str = "h.e.l.l.o";
string[] geteilt = s.Split('.');
s = String.Join(" ",geteilt);
//if-Abfragen
if(x>=0 && x<=10)
x++;
else if (x>=20 && x<=30)
x +=5;
else
x=0;
//switch
switch(Font)
{
case "Überschrift 1": "Heading 1":
Fontsize = 24;
break;
case "Überschrift 2": "Heading 2":
Fontsize = 20;
break;
case null:
Console.WriteLine("Kein Schema angegeben");
break;
default:
Console.WriteLine("Kenne die Grösse nicht");
break;
}
//auch gotos sind in switch-Anweisungen möglich

//Schleifen

while (i>n)
{
sum+=i;
i--;
}
do
{
sum += a[ i ];
i++;
}
while (i<n);

for (int i=0; i<n; i++)
sum+=i;
// Schleife für Arrays (z.B. auch Strings)
int[] x = {1,2,3,4,5,6,7,8,9};
foreach (int z in x) sum +=z;
C# Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//Zuweisungen
z += 58*R;
//Methodenaufrufe
string str = "h.e.l.l.o";
string[] geteilt = s.Split('.');
s = String.Join(" ",geteilt);
//if-Abfragen
if(x>=0 && x<=10)
    x++;
else if (x>=20 && x<=30)
    x +=5;
else
    x=0;
//switch
switch(Font)
{
    case "Überschrift 1": "Heading 1":
        Fontsize = 24;
        break;
    case "Überschrift 2": "Heading 2":
        Fontsize = 20;
        break;
    case null:
        Console.WriteLine("Kein Schema angegeben");
        break;
    default:
        Console.WriteLine("Kenne die Grösse nicht");
        break;
}
//auch gotos sind in switch-Anweisungen möglich

//Schleifen

while (i>n)
{
    sum+=i;
    i--;
}
do
{
    sum += a[ i ];
    i++;
}
while (i<n);

for (int i=0; i<n; i++)
sum+=i;
// Schleife für Arrays (z.B. auch Strings)
int[] x = {1,2,3,4,5,6,7,8,9};
foreach (int z in x) sum +=z;


9 Klassen und Strukturen

- Klassen:

• Objekte liegen auf dem Heap (Referenztypen)
• Erzeugung von Objekten mit new
C# Code:
Stack s = new Stack(255);
C# Code:
Stack s = new Stack(255);
C# Code:
Stack s = new Stack(255);

• können erben, vererben und Interfaces implementieren (alle Klassen von object abgeleitet)
• dürfen Destruktor besitzen


Konstruktoren:

Konstruktoraufruf erzeugt neues Objekt auf dem Heap und initialisiert es
• überladbar
• this ruft anderen Konstruktor auf (im Kopf des Konstruktors)
• erst Initialisierungen, dann Konstruktoren
• kein Konstruktor => parameterloser Default-Konstruktor (nur dann)

- Strukturen:

• Objekte liegen auf dem Stack (Werttypen)
Können mit new erzeugt werden (ohne new sind Felder nicht initialisiert)
• Felder dürfen bei der Deklaration nicht initialisiert werden
C# Code:
struct rechteck
{
    int laenge = 0;// Compiler-Fehler
    int breite;//OK
    ...
}
C# Code:
struct rechteck
{
int laenge = 0;// Compiler-Fehler
int breite;//OK
...
}
C# Code:
struct rechteck
{
    int laenge = 0;// Compiler-Fehler
    int breite;//OK
    ...
}

• Konstruktoren müssen mindestens einen Parameter besitzen
• können Interfaces implementieren (aber nicht erben oder vererben)
• dürfen keinen Destruktor besitzen

Konstruktoren:

Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
• haben immer einen parameterlosen Default-Konstruktor
• => keinen eigenen parameterlosen Konstruktor anlegen

:arrow: Es gibt keine anonymen Klassen (wie in Java)
:arrow: Es gibt keine Templates (wie in C++)

10 Referenz

Die . NET-Technologie. Grundlagen und Anwendungsprogrammierung. von Wolfgang Beer, u. a. Dpunkt Verlag (Oktober 2002)

_________________
get off your butt


Zuletzt bearbeitet von GPC am 10:42:55 21.11.2006, insgesamt 6-mal bearbeitet
ncc-1701-m
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.01.2003
Beiträge: 32
Beitrag ncc-1701-m Mitglied 11:04:38 14.06.2006   Titel:   Korrektur:            Zitieren

Hallo,

die Einführung gilt nur für .NET 1.x. Im .NET Framework 2.0 gibt es sehr wohl Templates sowie anonyme Methoden.

Außerdem stimmt folgendes nicht ganz:
Polofreak schrieb:

Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
• haben immer einen parameterlosen Default-Konstruktor
• => keinen eigenen parameterlosen Konstruktor anlegen

wenn man in einer Klasse folgendes macht:
C# Code:
public class TestClass
{
    public TestClass(int a)
    {
    }
}
C# Code:
public class TestClass
{
public TestClass(int a)
{
}
}
C# Code:
public class TestClass
{
    public TestClass(int a)
    {
    }
}

Hat die Klasse KEINEN!!! parameterlosen Default-Konstruktor mehr. Dann muss man einen eigenen parameterlosen Default-Konstruktor anlegen:
C# Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
public class TestClass
{
    public TestClass()
    {
    }

    public TestClass(int a)
    {
    }
}
C# Code:
1
2
3
4
5
6
7
8
9
10
public class TestClass
{
public TestClass()
{
}

public TestClass(int a)
{
}
}
C# Code:
1
2
3
4
5
6
7
8
9
10
public class TestClass
{
    public TestClass()
    {
    }

    public TestClass(int a)
    {
    }
}

_________________
=/\=

Live long and prosper
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5550
Beitrag LordJaxom Mitglied 11:10:08 14.06.2006   Titel:   Re: Korrektur:            Zitieren

ncc-1701-m schrieb:
die Einführung gilt nur für .NET 1.x. Im .NET Framework 2.0 gibt es sehr wohl Templates sowie anonyme Methoden.


Nein, in C# 2.0 gibt es keine Templates, sondern nur Generics. Dazwischen besteht ein deutlicher Unterschied.

EDIT:
Und beim zweiten Punkt ging es um Strukturen, nicht um Klassen! Da hat Polofreak dann durchaus recht mit diesen Punkten.


Zuletzt bearbeitet von LordJaxom am 11:12:00 14.06.2006, insgesamt 2-mal bearbeitet
xyzungelöst
Unregistrierter




Beitrag xyzungelöst Unregistrierter 16:43:40 14.06.2006   Titel:              Zitieren

Zitat:
Nein, in C# 2.0 gibt es keine Templates, sondern nur Generics. Dazwischen besteht ein deutlicher Unterschied.

Was heißt nur. C++ Templates sind zwar first class, haben aber auch einige Nachteile. Sie können einen ziemlichen code bloat verursachen. Binaries von Programen die intensiv dieses Feature nutzen werden nämlich recht fett. Ein Problem das ich leider gerade habe ...
Auch kannst du mit .NET Generics andere nette Dinge machen, die mit C++ Templates nicht funktionieren. z.B Typ-Parametrisierte virtuelle Methoden.
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5550
Beitrag LordJaxom Mitglied 19:26:05 14.06.2006   Titel:              Zitieren

Ich wollte damit die Sprache auch keinesfalls schmälern, und ich weiss sehr wohl was man mit Generics alles machen kann (und was nicht) ;)
Polofreak
Autor

Benutzerprofil
Anmeldungsdatum: 10.03.2005
Beiträge: 2118
Beitrag Polofreak Autor 08:38:10 20.06.2006   Titel:              Zitieren

danke Lord Jaxom genau darum ging es ;)

Das mit den Klassen und Structs sollte vielleicht ein wenig auseinander stehen, dann sieht man besser worum es geht :rolleyes:

aber danke dennoch für die Kritiken :live:

_________________
get off your butt
Martin Barber
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.07.2007
Beiträge: 33
Beitrag Martin Barber Mitglied 23:13:38 02.11.2007   Titel:   Noch mehr            Zitieren

Schreib noch bisschen mehr über die C# Grundlagen.
Will weiter Lernen.
Bing
Unregistrierter




Beitrag Bing Unregistrierter 00:04:53 21.01.2008   Titel:   Re: Einführung in C# .Net            Zitieren

Zitat:

Solche Felder sind nicht sehr schnell und brauchen mehr Speicher als
rechteckige Felder:
C# Code:
int[,] re = new int[2, 3];
C# Code:
int[,] re = new int[2, 3];
C# Code:
int[,] re = new int[2, 3];

Hier sind die Zugriffe effizienter und die Felder kompakter.


Das ist falsch, jagged Arrays sind - zumindest bislang - schneller als MD-Arrays (ja, trotz doppelter Indirektion). Kann man ganz leicht selber testen. Oder eben nachlesen, z.B.:

http://msdn2.microsoft.com/en-us/library/ms998547.aspx#scalenetchapt05_topic27
didle
Unregistrierter




Beitrag didle Unregistrierter 09:48:49 14.02.2008   Titel:              Zitieren

Zitat:
Es gibt keine anonymen Klassen (wie in Java)

Es gibt allerdings seit C# 3.0 Anonymous Types und im Zusammenspiel mit Anonymous Delegates kann sich wohl was ähnliches zusammenschustern.
C/C++ Forum :: Die Artikel ::  Einführung in C# .Net   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.