Question

J'essaie actuellement de porter du code VB.NET en C #.

La structure ressemble à ceci dans VB.NET:

Public Structure sPos
    Dim x, y, z As Single
    Function getSectorY() As Single
        Return Math.Floor(y / 192 + 92)
    End Function
    Function getSectorX() As Single
        Return Math.Floor(x / 192 + 135)
    End Function
    Function getSectorXOffset() As Int32
        Return ((x / 192) - getSectorX() + 135) * 192 * 10
    End Function
    Function getSectorYOffset() As Int32
        Return ((y / 192) - getSectorY() + 92) * 192 * 10
    End Function
End Structure

Version C # de la structure:

    public struct sPos
    {
        public float x;
        public float y;
        public float z;
        public float getSectorY()
        {
            return (float)Math.Floor(y / 192 + 92);
        }
        public float getSectorX()
        {
            return (float)Math.Floor(x / 192 + 135);
        }
        public Int32 getSectorXOffset()
        {
            return (int)((x / 192) - getSectorX() + 135) * 192 * 10;
        }
        public Int32 getSectorYOffset()
        {
            return (int)((y / 192) - getSectorY() + 92) * 192 * 10;
        }
    }

Pourquoi dois-je convertir les valeurs de retour en float & amp; int? Dans la version vb, je n'ai pas à le faire.

Merci à tous.

Était-ce utile?

La solution

Placez un () après getXSectorOffset car c'est une fonction?

exemple:

nullPointX = pictureBox1.Width / 2 - sectorsize - centerPos.getSectorXOffset() / 10 * sectorsize / 192;

En ce qui concerne la deuxième question, vous pouvez éviter le transfert en flottant avec cette modification:

public float getSectorY()
    {
        return (float)Math.Floor(y / 192f + 92f);
    }

Et désolé, vous devrez toujours utiliser int . Sauf si vous convertissez x et getXOffset () en int pendant la fonction:

public Int32 getSectorXOffset()
    {
        return (((int)x / 192) - (int)getSectorX() + 135) * 192 * 10;
    }

Autres conseils

Notez que vous ne devez pas utiliser " Dim " sur les variables de niveau classe / structure. Toujours utiliser Public, Protected, Private, etc.

Notez également que la division fonctionne différemment en VB et en C #. En VB, si vous divisez deux entiers comme suit:

Dim r As Double = 5/2

Alors r sera un double avec une valeur de 2,5

Cependant, en C #, la division avec les entiers vous donne un résultat entier, 2 dans ce cas.

Si vous définissez Option Strict On dans votre code VB (ce que vous devez réellement toujours faire), je pense que vous devrez convertir les valeurs de retour en VB. ainsi: Math.Floor () retourne un Double, pas un Simple, et vous devriez vraiment dire au compilateur que vous voulez perdre cette précision (c'est ce que fait le (float) dans la version C #) plutôt que de laisser le compilateur jetez la précision sans que vous preniez une décision éclairée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top