[C#] :this() nach VB übersetzen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Eistee.

    [C#] :this() nach VB übersetzen

    Könnte mir Jemand der C# besser drauf hat als ich, mir diesen Block übersetzen?

    Quellcode

    1. public struct frameState
    2. {
    3. public frameAnimation Animation { get; set; }
    4. public frameState(frameAnimation animation)
    5. :this()
    6. {
    7. this.Animation = animation;
    8. }
    9. }


    Die Online Converter machen darraus:

    VB.NET-Quellcode

    1. Public Structure frameState
    2. Public Property Animation() As frameAnimation
    3. Get
    4. Return m_Animation
    5. End Get
    6. Set
    7. m_Animation = Value
    8. End Set
    9. End Property
    10. Private m_Animation As frameAnimation
    11. Public Sub New(animation As frameAnimation)
    12. Me.New() 'ALso hier fehlt ja das Argument
    13. Me.Animation = animation
    14. End Sub
    15. End Structure


    Nur das Me.New() in Public Sub New(animation As frameAnimation) ja auch wieder ein Argument erwartet.
    Edit:
    Da hat sich ein Fehler eingeschlichen. Siehe Post #10 und #12
    Ende Edit.

    Das :this() bedeutet nur, dass ein Konstruktor der Basisklasse aufgerufen wird. Nämlich der, ohne Argumente.
    Beispiel:

    C-Quellcode

    1. class Foo
    2. {
    3. public Foo(int SomeStuff)
    4. {
    5. //Etwas mit SomeStuff tun.
    6. }
    7. }
    8. class Bar : Foo
    9. {
    10. public Bar(int OtherStuff) :this(OtherStuff)
    11. {
    12. }
    13. }

    ist dann wie in VB:

    VB.NET-Quellcode

    1. Class Foo
    2. Public Sub New(SomeStuff As Integer)
    3. 'Etwas mit SomeStuff tun.
    4. End Sub
    5. End Class
    6. Class Bar
    7. Inherits Foo
    8. Public Sub New(OtherStuff As Integer)
    9. MyBase.New(OtherStuff)
    10. End Sub
    11. End Class


    Strukturen können nicht von anderen Strukturen erben. Deshalb ist die Basisklasse jeder Struktur Object.
    Und Object hat nur einen Konstruktor. Nämlich einen ohne Argumente.
    Hier wollte wohl jemand explizit den Konstruktor von Object aufrufen. Passiert aber normalerweise automatisch. Du kanst das :this() einfach ignorieren.

    Beispiel:

    VB.NET-Quellcode

    1. Private Sub TestFoo()
    2. Dim FooInstance As New Foo(1234)
    3. End Sub
    4. Class Foo 'Funktioniert mit Structure genau gleich.
    5. Dim _Stuff As Integer
    6. Public Sub New(ByVal SomeStuff As Integer)
    7. _Stuff = SomeStuff
    8. End Sub
    9. End Class

    Ergibt:
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    das wäre eine 1:1-Übersetzung des Orig-Codes:

    VB.NET-Quellcode

    1. Public Structure frameState
    2. Public Property Animation() As frameAnimation
    3. Public Sub New(ByVal animation As frameAnimation)
    4. Me.Animation = animation
    5. End Sub
    6. End Structure

    möglicherweise ist der Orig-Code nichtmal lauffähig, grad wegen diesem :this() - aber ich bin jetzt zu faul, das nachzugucken.
    Aufpassen: this ist nicht die Basisklasse, sondern eben genau diese Klasse. Es wird der parameterlose Konstruktor der struct aufgerufen. Dieser ist definiert, aber kann nicht manuell verändert werden, da struct keine Null-Werte annehmen kann (liegt ja auf dem Stack, nicht im Heap, also macht Null keinen Sinn). Das macht insbesondere bei Arrays Probleme, da alle Werte erst mal initialisiert werden müssen und somit der Konstruktor für alle Werte aufgerufen werden müsste.
    In C# müssen vor Lesezugriffen innerhalb der struct erst alle Felder initialisiert werden, daher eben der this()-Aufruf. In VB ist das wohl nicht der Fall, wird wohl automatisch erledigt.
    Übrigens beginnen in .Net alle Typen mit Großbuchstaben.

    Gruß
    ~blaze~

    ErfinderDesRades schrieb:

    möglicherweise ist der Orig-Code nichtmal lauffähig, grad wegen diesem :this()

    Nope, läuft 1A:


    Edit:

    ~blaze~ schrieb:

    this ist nicht die Basisklasse, sondern eben genau diese Klasse

    Arrrg!
    Danke.
    Bei base() wird der Konstruktor der Basisklasse aufgerufen. Ich hab das total verwechselt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Wird so nicht kompilieren. ;) Structs müssen mindestens eine Variable enthalten:

    C-Quellcode

    1. struct Yoo
    2. {
    3. public int Val { get; set; }
    4. public Asdf(int val)
    5. //: this()
    6. {
    7. Val = val;
    8. }
    9. }

    kompiliert nicht, da eben das : this() fehlt. Da es sich eben um Properties handelt und nicht um Felder und die eben über Methoden arbeiten, kann Val nicht zugewiesen werden, da für den Compiler nicht feststehlt, ob der Setter nicht Inhalte aus der Struct benötigt, die ggf. noch nicht festgelegt wurden. Kp, ob der VB-Compiler automatisch erkennt, ob alle zugewiesen wurden (vmtl. nicht) oder ob er einfach mal alles initialisiert, egal ob's benötigt wird oder nicht.

    Gruß
    ~blaze~
    Ach, die C# IDE wieder mit ihren Eigenheiten...
    Stimmt.
    Strukturen können keine expliziten parameterlosen Konstruktoren enthalten.

    Sobald man einen Parameter in die Signatur einfügt, funktioniert's.

    Ich hab mir mal folgendes im ILSpy angesehen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim test As New Foo
    3. MessageBox.Show(test.PropertyBlarg.ToString)
    4. End Sub
    5. Structure Foo
    6. Public Property PropertyBlarg As Integer
    7. Public Sub New(ByVal Blarg As Integer)
    8. PropertyBlarg = Blarg 'Funktioniert übrigens einwandfrei.
    9. End Sub
    10. End Structure

    Quellcode

    1. .method private
    2. instance void Button1_Click (
    3. object sender,
    4. class [mscorlib]System.EventArgs e
    5. ) cil managed
    6. {
    7. // Method begins at RVA 0x3118
    8. // Code size 32 (0x20)
    9. .maxstack 1
    10. .locals init (
    11. [0] valuetype WindowsApplication1.Form1/Foo test,
    12. [1] int32 VB$t_i4$S0
    13. )
    14. IL_0000: nop
    15. IL_0001: ldloca.s test
    16. IL_0003: initobj WindowsApplication1.Form1/Foo //<<<-----hier!
    17. IL_0009: ldloca.s test
    18. IL_000b: call instance int32 WindowsApplication1.Form1/Foo::get_PropertyBlarg()
    19. IL_0010: stloc.1
    20. IL_0011: ldloca.s VB$t_i4$S0
    21. IL_0013: call instance string [mscorlib]System.Int32::ToString()
    22. IL_0018: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
    23. IL_001d: pop
    24. IL_001e: nop
    25. IL_001f: ret
    26. } // end of method Form1::Button1_Click

    (Ein IL-Tag wäre genial ^^)

    http://msdn.microsoft.com/library/system.reflection.emit.opcodes.initobj.aspx schrieb:

    Initializes each field of the value type at a specified address to a null reference or a 0 of the appropriate primitive type.


    Bei C# sieht's exakt gleich aus. Nur muss eben das : this() dabei stehen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Danke euch, man lernt immer wieder was dazu :)
    Auch wenn das mit dem Struct jetzt klappt, hilft es im Bezug auf das Projekt/die Übersetzung auch nicht mehr weiter.
    So langsam bin ich es irgendwie leid, das man jedes Beispiel Projekt auf dem INet erst übersetzen, muss um hinterher
    (nach Stunden) doch wieder feststellen zu müssen, das es sich einfach nicht mal eben so übersetzen lässt.
    Genau 30 Sekunden nachdem sich das Problem mit dem Struct aufgelöst hat, erscheint auch schon das nächste.
    Wobei es im Schwirigkeitsgrad immer weiter steigt, wohl bemerkt.

    Einfach:
    Spoiler anzeigen
    Fehler 1 Beim Deserialisieren von Intermediate-XML ist ist ein Fehler aufgetreten: Typ "SkeletonAnimation" kann nicht gefunden werden. C:\Users\\documents\visual studio 2010\Projects\SkeletalAnimation_VB\SkeletalAnimation_VB\SkeletalAnimation_VBContent\zombie_animation.xml 3 10 SkeletalAnimation_VB


    Schon richtig nervig (Kann den Fehler auch nach ewigen suchen nicht finden):
    Spoiler anzeigen
    Element [Keyframe] nicht gefunden (Völlig ohne ersichtlichen Grund, Die unter Geordneten Elemente werden zuvor aber noch korrekt eingelesen)


    Richtig Ätzent! (In C# läuft es rund, VB macht wieder stress):
    Spoiler anzeigen
    Fehler 1 Inhaltsausgabe InvalidOperationException wird erstellt: Die 'ReadContentAsString'-Methode wird für den Knotentyp Element nicht unterstützt. Wenn Sie den typisierten Inhalt eines Elements lesen möchten, verwenden Sie die 'ReadElementContentAs'-Methode. Zeile 4, Position 6. bei System.Xml.XmlReader.ReadContentAsString() bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.XmlListReader..ctor(IntermediateReader reader) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.CollectionHelper.Deserialize(IntermediateReader input, ContentSerializerAttribute format, Object collection) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.ArraySerializer`1.Deserialize(IntermediateReader input, ContentSerializerAttribute format, T[] existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.ContentTypeSerializer`1.Deserialize(IntermediateReader input, ContentSerializerAttribute format, Object existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.IntermediateReader.ReadRawObjectInternal[T](ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, Object existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.IntermediateReader.ReadObjectInternal[T](ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, Object existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.ReflectiveSerializerMemberHelper.DeserializeRegularObject(IntermediateReader input, Object parentInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.ReflectiveSerializerMemberHelper.Deserialize(IntermediateReader input, Object parentInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.ReflectiveSerializer.Deserialize(IntermediateReader input, ContentSerializerAttribute format, Object existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.IntermediateReader.ReadRawObjectInternal[T](ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, Object existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.IntermediateReader.ReadObjectInternal[T](ContentSerializerAttribute format, ContentTypeSerializer typeSerializer, Object existingInstance) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.IntermediateReader.ReadObject[T](ContentSerializerAttribute format) bei Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate.IntermediateSerializer.Deserialize[T](XmlReader input, String referenceRelocationPath) bei Microsoft.Xna.Framework.Content.Pipeline.XmlImporter.Import(String filename, ContentImporterContext context) bei Microsoft.Xna.Framework.Content.Pipeline.ContentImporter`1.Microsoft.Xna.Framework.Content.Pipeline.IContentImporter.Import(String filename, ContentImporterContext context) bei Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.ImportAssetDirectly(BuildItem item, String importerName) bei Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.ImportAsset(BuildItem item) bei Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAssetWorker(BuildItem item) bei Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAsset(BuildItem item) bei Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.RunTheBuild() bei Microsoft.Xna.Framework.Content.Pipeline.Tasks.BuildContent.RemoteProxy.RunTheBuild(BuildCoordinatorSettings settings, TimestampCache timestampCache, ITaskItem[] sourceAssets, String[]& outputContent, String[]& rebuiltContent, String[]& intermediates, Dictionary`2& dependencyTimestamps, KeyValuePair`2[]& warnings) C:\Users\Steffen\Documents\Visual Studio 2010\Projects\Test_SA\Test_SA\Test_SAContent\machine_skeleton.xml Test_SA


    Also falls Du dich mal gerne so sich riiiichtig schön aufregen möchtest: Viel Spaß beim Übersetzen "SkeletalAnimation.zip" von catalinzima.com

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eistee“ ()