مشكلة أثناء ترقية كود VB.NET إلى C #
سؤال
وحاليا أحاول أن ميناء بعض رمز VB.NET إلى C #.
ووالبنية يشبه هذا في 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
وC # إصدار البنية:
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;
}
}
وماذا يجب أن يلقي القيم العودة إلى تعويم وكثافة العمليات؟ في النسخة رموز ليس لدي ل..
وشكرا للجميع.
المحلول
ووضع ()
بعد getXSectorOffset
لأنها وظيفة؟
وعلى سبيل المثال:
nullPointX = pictureBox1.Width / 2 - sectorsize - centerPos.getSectorXOffset() / 10 * sectorsize / 192;
وفيما يتعلق بالسؤال الثاني، هل يمكن تجنب المدلى بها لتعويم مع هذا التعديل:
public float getSectorY()
{
return (float)Math.Floor(y / 192f + 92f);
}
وآسف، سيكون لديك للادلاء إلى int
لا يزال. إلا إذا كنت يلقي x
وgetXOffset()
إلى int
خلال وظيفة:
public Int32 getSectorXOffset()
{
return (((int)x / 192) - (int)getSectorX() + 135) * 192 * 10;
}
نصائح أخرى
ملحوظة التي يجب أن لا تستخدم "خافت" على متغيرات مستوى الفئة / هيكل. دائما استخدام العام، المحمية، الخاصة وغيرها.
ونلاحظ أيضا أن تقسيم يعمل بشكل مختلف في VB و C #. في VB، إذا قمت بتقسيم عددين مثل ذلك:
Dim r As Double = 5/2
وثم ص ستكون مزدوجة مع قيمة 2.5
في C # ومع ذلك، وتقسيم مع الأعداد الصحيحة يمنحك عدد صحيح النتائج، و 2 في هذه القضية.
إذا قمت بتعيين على خيار صارمة على في كود VB الخاص بك (التي كنت حقا يجب أن <م> دائما م> تفعل) ثم أعتقد كنت بحاجة للادلاء القيم المرجعة في VB وكذلك: Math.Floor () بإرجاع مزدوجة، وليس واحدة، ويجب أن أقول حقا المترجم أن أردت أن تفقد الدقة (وهو ما تعويم) الزهر (في C # نسخة لا) بدلا من السماح للمترجم رمي الدقة بعيدا دون أن جعل قرار مستنير.