C#有兩種不同類型的對象的 - 引用類型和值型。
已被混合兩種(很常見的C /帕斯卡)的代碼,因爲你有一個C#數值類型(在struct
xActor)和參考型指的是同一類型(指針PxActor
),這不是完全可以在C#中使用。
但是,有些方法可以模擬類似的行爲。但首先,你必須考慮這個應該工作的邏輯方式。也許這只是一個性能調整(例如,使用PxActor
而不是xActor
,因爲您希望在整個xActor
結構中保留額外內存)。也許相反,你想要從多個地方獲得相同的價值,並且是可變的。
這兩種情況通常可以通過簡單地使xActor
需要解決的class
- 在C#中,這意味着它永遠是一個引用類型(不是一件有意義的C /帕斯卡爾,但在C#和類似語言的主要對象)。但是,您需要手動檢查使用任何類型xActor
或PxActor
的任何地方,並確保值/引用語義仍然相同。這可能導致一些難以發現的錯誤,這取決於原始代碼。
另一種選擇是創建一個包裝類。所以你會保留你的struct xActor
,但你也會創建一個class PxActor
,它將有一個xActor
字段。這不是Pascal指針的精確模擬,但是如果你小心點,它可以以類似的方式使用。主要區別在於,您無法在某處捕獲指向現有值的指針 - 您只能創建一個新的PxActor
,它自己的副本的xActor
。訪問PxActor
實例的任何人也將使用相同的xActor
實例,但無論何時您存儲xActor
本身,它都是新副本。但在最簡單的情況下,您可以將手動分配xActor
和後續@
替換爲new PxActor()
,並且可以將variable^.Gender
替換爲variable.ActorField.Gender
。
就在重構本身時,也可以使用C#的指針。與C/Pascal相比,它們有點有限,但它們可能適用於您的案例。價值除外string
。然而,指針有很多成本,所以你不想使用它們,除非它們是一個好主意,這不是那種情況:)
換句話說,做一個1通常是個壞主意:1從Pascal翻譯爲C#。你需要弄清楚所有東西背後的語義。尋找全部給定類型的使用將是一個巨大的瑣事。逐行翻譯可以輕鬆將您繪製到一個角落。 C#是一種非常安全的語言,CLR非常善於確保每個人都可以相互交流,但這也意味着在價值/參考傳遞等方面存在一些差異。現在,IIRC,Pascal默認具有價值語義,所以使用struct
以及類似的語言在C#中也應該能夠很好地工作。不過,你必須分析指針的使用。有時候,你可以使用C#的out
或ref
而不是指針 - 爲此。但是你在這裏的情況並不是這樣 - 它是一個存儲在另一個類型中的指針,不僅僅作爲參數傳遞。然而,這仍然沒有告訴我們這些應該如何在實踐中發揮作用 - 也許這只是一種解決帕斯卡侷限性的方法;也許你會在C#中使用List<xActor>
而不是array of PxActor
。
當然,這通常是最好的選擇。在可能的情況下,使用慣用的C#,而不是試圖在C#中編寫Pascal代碼。雖然有很多相似之處,但也有大量的差異可以咬你,讓你的工作比必要的更難。找到List<SomeType>
將比array of PSomeType
更好的地方。找到可以使用ref
和out
而不是PSomeType
的地方。找到struct
有意義,class
會更好。這適用於許多細微的差異,可能會毀了你的一天,所以你可能會發現很多問題隨着時間的推移,但這是一段旅程:)
「創建一個類型,包括xActor的指針」 - 更準確地表達,它的意思是「創建一個'PxActor'類型;'PxActor'類型的變量是指向'xActor'類型的記錄的指針。「 –
您應該考慮將其聲明爲類而不是結構。 '^ xActor'表示「指向xActor的指針」。 –
您可以將其讀爲'PxActor'類型是指向'xActor'結構的指針。在'yActor'記錄裏面是這樣的指針的'Actor'數組。 – TLama