2015-09-04 46 views
2

超簡單的C#問題,因爲我試圖更好地選擇語言。我來自C++的背景,並且有點不確定沒有指針的解決方案。來自C++指針的C#動態變量

例如,如果我想要一個參考給一個變量我將宣佈它作爲

class Foo{ 
private: 
    SomeClassType* sct; 
    SomeOtherClass* soc; 
public: 
    Foo(SomeClassType* xSct, SomeOtherClass* xSoc) : sct(xSct), soc(xSoc) {} 
} 

所以在C#我會用我猜一個靜態引用或者一些其他的動態分配辦法?我不想讓這些100個漂浮在那裏。 我不能爲我的生活似乎谷歌正確的話來弄清楚這一點。

C#中的等價物是什麼?的

回答

5

C#的引用將這裏替換你的指針:

class Foo { 
    SomeClassType sct; 
    SomeOtherClass soc; 

    public Foo(SomeClassType xSct, SomeOtherClass xSoc) { 
    // Note: No initializer list, we have to do those assignments manually 
    sct = xSct; 
    soc = xSoc; 
    } 
} 

他們實際上充當幾乎相同的大多數情況的使用(例外是指針運算,這將是無用這裏反正)。訪問這些實例的成員是始終使用C#中的點.完成;沒有像C++中的->

通過某種方式,您可以像C++引用一樣對待它們,只是您可以重新分配它們。

+0

但每次創建Foo類的對象時,都不會每次都實例化這兩個變量嗎?我希望sct是一個指向給定內存地址的指針,而不是在構造函數中創建的全新「對象」 – sl133

+0

創建'Foo'實例時,這兩個字段是未分配的。他們是'空'。您可以爲它們分配新的實例('sct = new SomeClassType()')或重新使用從外部傳入的實例,例如作爲ctor參數:public Foo(SomeClassType sct){this.sct = sct; }'。 – Joey

+0

好吧,不知道他們是否將賦值運算符的默認操作 – sl133

10

超級簡單的C#問題

其實這是一個非常深刻的問題。

我來自C++的背景,我有點不確定沒有指針的解決方案。

C#確實有指針,但它們幾乎從不使用。

例如,如果我想可變

單個參考有問題就在那裏。停止思考我需要一個變量的引用,所以我需要一個指針。是的,指針是對變量的引用的實現,但這在C#中是非常錯誤的思考方式。在C#中你可以以幾種不同的方式引用變量,但是你幾乎不需要。你在C#中做的是參考對象,而不是變量

在C#,這是一類是引用類型自動成爲參考該類型的對象的值。

所以:

class C 
{ 
    public int x; 
} 

類型C的值是一個參考至C的一個實例;這就是「類」在C#中的含義。所以你可以這樣說:

class D 
{ 
    public C c; 
} 

而且D的一個實例有一個C類型的字段。這是一個變量。該變量的值是參考到類型C的實例。該實例具有int類型的變量x;該變量的值不是對任何東西的引用,它只是整數。