Forum: PC-Programmierung C# Typendefinitionen


von Hans (Gast)


Lesenswert?

Ich benutze neuerdings C# und habe mir dort eigene Datentypen definiert, 
quasi wie in meinen embedded Projekten (16bit µC).
1
    using SINT8 = System.SByte;    // char
2
    using UINT8 = System.Byte;     // unsigned char
3
    using SINT16 = System.Int16;   // int
4
    using UINT16 = System.UInt16;  // unsigned int
5
    using SINT32 = System.Int32;   // long
6
    using UINT32 = System.UInt32;  // unsigned long
7
    using FLOAT32 = System.Single; // float

In ANSI C binde ich überall den Header mit den typedefs ein und fertig. 
Jetzt suche in C# auch eine Möglichkeit, dies so zu handhaben. Bis jetzt 
muss in jede Datei die oben aufgeführte Typendefinition reinkopiert 
werden.

Versuche eine DLL zu erstellen und diese per using einzubinden, schlugen 
fehl.

Gibt es eine Methode, ähnlich ANSI C, die Typendefinitionen als eine Art 
Header einzubinden?

von Christopher C. (Gast)


Lesenswert?

Sowas ist in C#  nicht möglich.  Header gibts auch keine( zum Glück). 
Nutze doch einfach die normalen Bezeichnungen,  so wie es auch gedacht 
ist. Solche  Großschreibungen sind in C# sowieso nicht erwünscht.

von Mike M. (mikeii)


Lesenswert?

Warum der Typedef? Macht doch vllt im Zusammenhang mit Structs Sinn, 
sonst ist das für mich eigentlich nur Kosmetik. C# ist Objektorientiert, 
also kann man es ja ganz weglassen oder nicht?

Welches Ziel verfolgst du denn?

Auszug zum Typedef in der Wiki "C# also contains a feature which is 
similar to the typedef of C; however, it must be redeclared for each 
separate file"

von Jasch (Gast)


Lesenswert?

Hans schrieb:
> Ich benutze neuerdings C# und habe mir dort eigene Datentypen definiert,
> quasi wie in meinen embedded Projekten (16bit µC).
>
>
1
>     using SINT8 = System.SByte;    // char
2
>     using UINT8 = System.Byte;     // unsigned char
3
>     using SINT16 = System.Int16;   // int
4
>     using UINT16 = System.UInt16;  // unsigned int
5
>     using SINT32 = System.Int32;   // long
6
>     using UINT32 = System.UInt32;  // unsigned long
7
>     using FLOAT32 = System.Single; // float
8
>
[...]
> Gibt es eine Methode, ähnlich ANSI C, die Typendefinitionen als eine Art
> Header einzubinden?

Nein.

Das würde auch keinen Sinn ergeben.

C# ist nicht C. In C kann z.B. "int" 16, 32, 64, was-auch-immer Bits 
groß sein.

In C# nicht, die Datentypen sind strikt festgelegt - schau mal auf die 
Namen, was glaubst Du meint das "16" oder "32" im Namen eigentlich? Es 
gibt also keinen Bedarf sowas zu tun, und entsprechend sollte man es 
auch nicht tun.

Nebenbei bemerkt, die "geboxten" statt der nativen Typen zu benutzen ist 
nicht direkt clever wenn nicht aus irgendeinem konkreten Grund 
notwendig. Overhead, unerwünschte Effekte und so Scheiss...

von D. I. (Gast)


Lesenswert?

Jasch schrieb:
> Nebenbei bemerkt, die "geboxten" statt der nativen Typen zu benutzen ist
> nicht direkt clever wenn nicht aus irgendeinem konkreten Grund
> notwendig. Overhead, unerwünschte Effekte und so Scheiss...

Zur Laufzeit dann doch egal, es wird doch immer die Objektvariante in c# 
angewandt, oder nicht?

von Jasch (Gast)


Lesenswert?

D. I. schrieb:
> Jasch schrieb:
>> Nebenbei bemerkt, die "geboxten" statt der nativen Typen zu benutzen ist
>> nicht direkt clever wenn nicht aus irgendeinem konkreten Grund
>> notwendig. Overhead, unerwünschte Effekte und so Scheiss...
>
> Zur Laufzeit dann doch egal, es wird doch immer die Objektvariante in c#
> angewandt, oder nicht?

Nein, soweit ich weiss nicht.

void Foo(int bar) {
    if (bar == null {
        ...
    }
}

ergibt einen Compilerfehler,

void Foo(Int32 bar) {
    if (bar == null {
        ...
    }
}

dagegen tut wie gedacht. Nativ (ein nackter 32-Bit-Integer) vs. "Boxed" 
(ein von Object abgeleitetes Dingens) eben. Das kann (wegen der 
"Nullbarkeit") zur Laufzeit nicht dasselbe sein.

von Olek (Gast)


Lesenswert?

Was sinnvoll unter c# ist, ist die union. Alles andere ergibt für mich 
ersteinmal keinen sinn, es aus der µC Welt mitzunhemen.

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
public struct SampleUnion
{
  [FieldOffset(0)] public bool Flag1;
  [FieldOffset(1)] public bool Flag2;
  [FieldOffset(2)] public bool Flag3;
  [FieldOffset(3)] public bool Flag4;
  [FieldOffset(0)] public long Composite;
}

class Sample
{
public static void Main()
{
  SampleUnion su = new SampleUnion();
  su.Flag1 = false;
  Console.WriteLine(su.Composite.ToString());
  su.Flag2 = true;
  Console.WriteLine(su.Composite.ToString());
  su.Flag3 = false;
  Console.WriteLine(su.Composite.ToString());
  su.Flag4 = true;
  Console.WriteLine(su.Composite.ToString());
}

von D. I. (Gast)


Lesenswert?

Jasch schrieb:
> Nein, soweit ich weiss nicht.
>
> void Foo(int bar) {
>     if (bar == null {
>         ...
>     }
> }
>
> ergibt einen Compilerfehler,
>
> void Foo(Int32 bar) {
>     if (bar == null {
>         ...
>     }
> }

Das ist zur Compilezeit. Ich meinte aber Laufzeit. Laut

http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_02_003.htm#mj2f5f2bae63590a7d163f13a30afb3b43

werden auch die "nackten" Datentypen später als Objekte behandelt.

von Jasch (Gast)


Lesenswert?

D. I. schrieb:
> Jasch schrieb:
>> Nein, soweit ich weiss nicht.
>>
>> void Foo(int bar) {
>>     if (bar == null {
>>         ...
>>     }
>> }
>>
>> ergibt einen Compilerfehler,
>>
>> void Foo(Int32 bar) {
>>     if (bar == null {
>>         ...
>>     }
>> }
>
> Das ist zur Compilezeit. Ich meinte aber Laufzeit. Laut
>
> 
http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_02_003.htm#mj2f5f2bae63590a7d163f13a30afb3b43
>
> werden auch die "nackten" Datentypen später als Objekte behandelt.

Keine Ahnung was Galileocomputing ist, aber was da geschrieben steht ist 
Bullshit. Naja, vielleicht auch nicht ganz, merke: "behandelt" != 
"sind", aber das wäre jedenfalls Compilezeit.

Die behaupten "Int32" und "int" wären Aliase, was sowieso schon keinen 
Sinn ergibt weil niemand, der noch bei Verstand und nicht total 
zugekifft ist, ohne guten Grund zwei Namen für ein und dasselbe Ding 
vergibt. Der Compiler macht ein paar Tricks um die ähnlich aussehen zu 
lassen, das ist es aber auch schon.

Und aus der Tatsache dass man einem Int32 "null" zuweisen kann, aber 
einem "int" nicht, folgt mehr oder weniger zwingend (bekloppte 
Sprachdesigner kann man recht sicher ausschliessen...) dass die *zur 
Laufzeit* auch verschieden repräsentiert sein müssen, immerhin sind ja 
die Wertebereiche sonst gleich und lassen kein "Null-Bit" oder sowas 
frei.

Für die fiesen Details siehe die Doku/die Standards zu C# und CLR. 
Sorry, irgendwelche, gar in Deutsch verfassten, Dokumente sind selten 
hilfreich. Hehehe, ich kann mich noch an Horror-Begriffe wie "mehrfädige 
Programmierung" - das kann sogar MS selbst verbrochen haben - erinnern. 
Da kommt Brechreiz hoch, hoffentlich sind die gottverdammten 
Verantwortlichen inzwischen sehr, sehr qualvoll verreckt... :-(

von Frank M. (aktenasche)


Lesenswert?

versteh nicht ganz was der vorteil von UINT32 gegenüber UInt32 sein soll

von Rocky B. (bitrocker)


Lesenswert?

@Jasch (der Gast)
Aha, das klingt ja spannend. Wie initialisierst du den einen 
int-Wertetyp ohne Operator mit einer Null Referenz? Würde mich mal 
interessieren, da deine Snippes (trotzt Korrektur), ob int oder Int32 
ein Warning ausgeben und beim Aufruf der Methode eine Execption 
geschmissen wird(!)

von __tom (Gast)


Lesenswert?

Jasch schrieb:
> Und aus der Tatsache dass man einem Int32 "null" zuweisen kann, aber
> einem "int" nicht, folgt mehr oder weniger zwingend

Zeig mir doch mal wie Du einem Int32 null zuweist...

von Sharping (Gast)


Lesenswert?

Jasch schrieb:
> Die behaupten "Int32" und "int" wären Aliase, was sowieso schon keinen
> Sinn ergibt weil niemand, der noch bei Verstand und nicht total
> zugekifft ist, ohne guten Grund zwei Namen für ein und dasselbe Ding
> vergibt. Der Compiler macht ein paar Tricks um die ähnlich aussehen zu
> lassen, das ist es aber auch schon.

int ist die Kurzform für Int32, weil dieses der mit Abstand am meisten 
genutzte Integer-Datentyp ist. Hinter beiden verbirgt sich EXAKT 
dasselbe.

von Simon K. (simon) Benutzerseite


Lesenswert?

Sharping schrieb:
> Jasch schrieb:
>> Die behaupten "Int32" und "int" wären Aliase, was sowieso schon keinen
>> Sinn ergibt weil niemand, der noch bei Verstand und nicht total
>> zugekifft ist, ohne guten Grund zwei Namen für ein und dasselbe Ding
>> vergibt. Der Compiler macht ein paar Tricks um die ähnlich aussehen zu
>> lassen, das ist es aber auch schon.
>
> int ist die Kurzform für Int32, weil dieses der mit Abstand am meisten
> genutzte Integer-Datentyp ist. Hinter beiden verbirgt sich EXAKT
> dasselbe.

So ist es und nicht anders.
1
Int32 Test1 = null;
1
NULL kann nicht in "int" konvertiert werden, da dieser Werttyp nicht auf NULL festgelegt werden kann.

Aber folgendes funktioniert. Hat aber nix mit dem Thema hier zu tun.
1
Nullable<Int32> Test2 = null;

von Rocky B. (bitrocker)


Lesenswert?

Nur vollständiger halber…
1
int? x = null;
…wäre der verkürzte Syntax dafür =)

von Jasch (Gast)


Lesenswert?

__tom schrieb:
> Jasch schrieb:
>> Und aus der Tatsache dass man einem Int32 "null" zuweisen kann, aber
>> einem "int" nicht, folgt mehr oder weniger zwingend
>
> Zeig mir doch mal wie Du einem Int32 null zuweist...

OK, OK, da habe ich etwas zwischen .NET und Java durcheinandergebracht.

Scheiss Programmiersprachen allesamt, jeder sollte nur noch Brainf*ck 
(das '*' steht für ein 'u', die Forumsoftware ist da irgendwie komisch, 
keine Ahnung wie irgendwer irgendwas finden soll wenn man es nicht 
korrekt schreiben darf? Oder wieso englische 4-Letter-Words in einem 
deutschen Forum relevant sein sollten? Sollte nicht eher "Scheiss" 
gefiltert werden?) benutzen. Oder Postscript. ;-)

Vermutlich sollte ich auch nicht so früh am Morgen in der Gegend 
herumposten.

Hmm, Java ist also an der Stelle konsistenter als C#... Scheisse, wer 
hätt's gedacht...

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.