2015-04-07 97 views
1

我想將lazarus項目轉換爲c#。目前爲止還不錯,但我現在有一個問題。C語言中的Lazarus指針類型#

有一個這樣的代碼:

xActor = record 
    Id: integer; 
    Value: integer; 
    Name: ansistring; 
    Height: integer; 
    Gender : Boolean; 
    Position : byte; 
    end; 

我在C#創建此作爲一個結構。但是,此代碼後,我看到了這樣的事情

PxActor = ^xActor; 

我研究了一下,發現指出,這意味着創建一個類型,其中包括xActor的指針,我可能是錯的壽。

然後我看到一個更有趣的記錄代碼

yActor = packed record 
    Actor: array [1..9] of PxActor; 
    end; 

在這一點上我不知道如何將這些轉換爲C#,因爲我不知道什麼PxActor = ^xActor;手段。

預先感謝

+0

「創建一個類型,包括xActor的指針」 - 更準確地表達,它的意思是「創建一個'PxActor'類型;'PxActor'類型的變量是指向'xActor'類型的記錄的指針。「 –

+0

您應該考慮將其聲明爲類而不是結構。 '^ xActor'表示「指向xActor的指針」。 –

+0

您可以將其讀爲'PxActor'類型是指向'xActor'結構的指針。在'yActor'記錄裏面是這樣的指針的'Actor'數組。 – TLama

回答

2

C#有兩種不同類型的對象的 - 引用類型和值型。

已被混合兩種(很常見的C /帕斯卡)的代碼,因爲你有一個C#數值類型(在struct xActor)和參考型指的是同一類型(指針PxActor),這不是完全可以在C#中使用

但是,有些方法可以模擬類似的行爲。但首先,你必須考慮這個應該工作的邏輯方式。也許這只是一個性能調整(例如,使用PxActor而不是xActor,因爲您希望在整個xActor結構中保留額外內存)。也許相反,你想要從多個地方獲得相同的價值,並且是可變的。

這兩種情況通常可以通過簡單地使xActor需要解決的class - 在C#中,這意味着它永遠是一個引用類型(不是一件有意義的C /帕斯卡爾,但在C#和類似語言的主要對象)。但是,您需要手動檢查使用任何類型xActorPxActor的任何地方,並確保值/引用語義仍然相同。這可能導致一些難以發現的錯誤,這取決於原始代碼。

另一種選擇是創建一個包裝類。所以你會保留你的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#的outref而不是指針 - 爲此。但是你在這裏的情況並不是這樣 - 它是一個存儲在另一個類型中的指針,不僅僅作爲參數傳遞。然而,這仍然沒有告訴我們這些應該如何在實踐中發揮作用 - 也許這只是一種解決帕斯卡侷限性的方法;也許你會在C#中使用List<xActor>而不是array of PxActor

當然,這通常是最好的選擇。在可能的情況下,使用慣用的C#,而不是試圖在C#中編寫Pascal代碼。雖然有很多相似之處,但也有大量的差異可以咬你,讓你的工作比必要的更難。找到List<SomeType>將比array of PSomeType更好的地方。找到可以使用refout而不是PSomeType的地方。找到struct有意義,class會更好。這適用於許多細微的差異,可能會毀了你的一天,所以你可能會發現很多問題隨着時間的推移,但這是一段旅程:)

+0

感謝這麼好的解釋。 –