C# Typendefinitionen

Gast #2908803
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?
#2909830
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"
Gast #2909980
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...
Gast #2911113
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.
Gast #2911121
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());
}
Gast #2911284
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.
Gast #2912544
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... :-(
Gast #2912965
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.
Persönliche Seite #2913005
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;
Gast #2914102
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren