Problème lors du portage du code VB.NET en C #
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.
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.