来自C++指针的C#动态变量

sl1*_*133 2 c# c++

超级简单的C#问题,因为我正在尝试更好地学习语言.我来自C++背景,并且不确定没有指针的解决方案.

例如,如果我想要对变量进行单一引用,我会将其声明为

class Foo{
private:
    SomeClassType* sct;
    SomeOtherClass* soc;
public:
    Foo(SomeClassType* xSct, SomeOtherClass* xSoc) : sct(xSct), soc(xSoc) {}
}
Run Code Online (Sandbox Code Playgroud)

所以在C#中,我必须使用我猜测静态引用或者其他动态分配方式?我不希望100%的这些漂浮在那里.我不能为我的生活似乎谷歌正确的话来弄清楚这一点.

C#中的等价物是什么?

Eri*_*ert 10

超级简单的C#问题

实际上这是一个非常深刻的问题.

我来自C++背景,并且不确定没有指针的解决方案.

C#确实有指针,但它们几乎从未使用过.

例如,如果我想要一个变量的单一引用

那里有问题.别想我需要一个变量的引用,所以我需要一个指针.是的,指针是对变量的引用的实现,但这在C#中考虑它是非常错误的.在C#中,您可以通过几种不同的方式引用变量,但几乎不需要.你在C#中做的是引用对象而不是变量.

在C#中,作为引用类型的类型的值自动引用该类型的对象.

所以:

class C 
{ 
    public int x; 
}
Run Code Online (Sandbox Code Playgroud)

类型C的值是对C实例的引用 ; 这就是C#中"类"的含义.所以你可以说:

class D 
{
    public C c; 
}
Run Code Online (Sandbox Code Playgroud)

并且D的实例具有类型C的字段.这是变量.变量的值是对类型C的实例的引用.该实例具有类型为int的变量x; 该变量的值不是对任何东西的引用,它只是整数.


Joe*_*oey 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

实际上,对于大多数用法,它们的行为几乎相同(例外情况是指针算术,无论如何这都是无用的).访问这些实例的成员总是.在C#中使用一个点; 不->喜欢在C++中.

在某种程度上,您可以像C++引用一样对待它们,只需要重新分配它们即可.

  • @Joey:我同意你的评论,但我不确定是否有**编译器魔法正在进行,只是*不同的*编译器魔术.:) (3认同)
  • 我想你应该从对C#实际工作原理的一个非常简单的概述开始.来自C++背景,有很多*不同的东西,并期待细微差别是相同的,不会帮助你.因为你刚刚提到了赋值运算符:它们不会过载并且完全可以预测它们在C#中的工作方式.与C++相比,语言的基本功能正在减少编译器魔法. (2认同)