2011-04-27 24 views
0

我們正在將我們的代碼從C++轉移到C#,並且由於C#的知識有限,我們陷入了奇怪的情況。我們的問題是:在C中使用類似於結構的指針#

在C++中,我們有2-3種類型的指針指向屬性的指針(std :: string),指針的用途是確保類似對象的所有實例指向相同屬性。例如

struct st1{ 
    string strVal; 
}; 
struct st2{ 
    string* strVal; 
}; 
//At time of creation 
st1* objst1 = new st1(); 
st2* objst2 = new st2(); 
objst2.strVal = &objst1.strVal; 

//After this at all point both object will point to same value. 

我想這種架構C#,我喜歡一些建議:

  1. 聲明事件
  2. 使代碼不安全的,使用指針(但我認爲這會導致一些其他問題)

請讓我知道,如果更好的東西,靠近C++可以在這裏做..

+1

不同的std :: string,System.String是不可變的,並且有在關心一般不點關於字符串引用,它的值是重要的。 – 2011-04-27 09:14:16

+1

您可以使用非託管關鍵字將大部分C++代碼直接包裝到C#中。也就是說,對於代表,事件處理程序和Func 和Action 的事件處理閱讀。很多寫在這裏。 – 2011-04-27 09:23:58

回答

3

在C#中,所有類都是引用/指針。所以只要你的屬性是類的類型,你可以在不同的結構中有相同的實例。

但是,使用字符串時可能會出現問題。雖然它是類和參考屬性,但它被強制爲不可變的。所以當你改變它時,你不會改變實例本身,但是你可以用這些改變來創建新的副本。浮現在腦海

一種解決方案是創建自定義字符串類,將只包含字符串,並把它作爲你的類型:

public class ReferenceString 
{ 
    public String Value { get; set; } 
} 
+2

另一個選擇是使用StringBuilder,它是可變的,更好地對應於std :: string。 – 2011-04-27 09:21:21

+0

@Felixt:我不知道。 Isnt StringBuilder有點重量?使用商店這樣的類似乎是錯誤的。但我可能是錯的。 – Euphoric 2011-04-27 09:26:10

+0

'StringBuilder'被實現爲'char []'數組的鏈表,其中每個數組不超過8k個字符。這使插入速度非常快,並使它們遠離大對象堆,但使它們不像字符串(它只是一個字符數組)輕。 – Gabe 2011-04-27 09:40:00

0

你可以使用一個靜態屬性繼承:

class thing 
{ 
    static string stringThing; 
    public string StringThing 
    { 
    get { return stringThing; } 
    set { stringThing = value; } 
    } 
} 

class thing2 : thing 
{ 
} 

再後來:

thing theThing = new thing(); 
theThing.StringThing = "hello"; 

thing2 theThing2 = new thing2(); 
// theThing2.StringThing is "hello" 
+0

我認爲這不會解決我的問題...... :( – vrajs5 2011-04-27 09:45:30

+0

aw,慚愧啊! – 2011-04-27 09:56:21