英语不是我的母语,我确实是个中国人。如果我不能清楚地表达我的想法,我会很抱歉。
我曾经用c ++编程。我真的不明白C#的参考。很多人告诉我 引用类似于c ++中的指针。如下面的
Person Foo = new Person(); // C#
Person *Foo = new Person(); // C++.
很多时候它运作良好。虽然许多C#编码员也告诉我类的实例是公正的 Foo.Foo有name.whiched被称为Foo.name.Foo有年龄,称为Foo.age。好像是 思想更容易用于编码。但这种思想不符合记忆模型。
请告诉我c#.a对象的引用是什么,或者更可能是指针?Thx。
答案 0 :(得分:0)
C#具有垃圾收集功能,默认情况下,它不支持指针。但是,您可以使用此处列出的指针http://msdn.microsoft.com/en-us/library/t2yzs44b(v=VS.80).aspx
答案 1 :(得分:0)
您需要熟悉参考类型和值类型之间的差异。
示例如下:
void Main()
{
Foo A = new Foo{Age = 16}; //A creates a space in memory for the data of Foo and points to that memory location
Foo B = A; //B just creates a variable and points to the memory location created by A
A.Bar();
B.Bar();
//Result
//Your Age is 16
//Your Age is 16
A.Age = 24;
A.Bar();
B.Bar();
//Result
//Your Age is 24
//Your Age is 24 <----- B is pointing to the same location as A and reflects the changes on call.
FooValueType E = new FooValueType{Age = 23};
FooValueType F = E;
E.Bar();
F.Bar();
//Result
//Your Age is 23
//Your Age is 23
E.Age = 56;
E.Bar();
F.Bar();
//Result
//Your Age is 56
//Your Age is 23
}
public class Foo //These object are by reference
{
public int Age { get; set; }
public void Bar()
{
Console.WriteLine("Your Age is {0}", Age);
}
}
public struct FooValueType //These object are by value
{
public int Age { get; set; }
public void Bar()
{
Console.WriteLine("Your Age is {0}", Age);
}
}
答案 2 :(得分:0)
当你说Person Foo = new Person();
new Person()
通过在Person
heap section
的对象
reference to memory allocated
之外的其他类型)。当Foo
捕获此引用时,您可以使用此引用访问对象属性,即methods and variables
。
在C ++中,
它遵循相同的步骤,但在c ++中,您在reference to object
类型pointer
中捕获Person
。
更具体地说,new
在内部调用operator new function
来分配memory dynamically
来创建对象。
在下面显示的图像中Person p
(on stack
)创建对new Person()
返回的对象的引用。
年龄和名称是Object的成员变量。因此,我们可以使用p.name
和p.age
轻松访问它们。
在c#和c ++中添加有关堆栈和堆内存分配的更多内容
object
,其中new Person()
在堆上获取内存,如果C#
更具体,则获取内存managed heap
<强>更新强>
当你说new Person()
时,它会在内部为类型的对象person
分配内存。这个对象由Persons members
组成,如图所示。
然后你可以做两件事
要么在Person
类型的变量中捕获此引用
例如Person p = new Person();
这里p
是对象的内存位置的引用。所以我可以使用p
轻松访问对象成员。
只是不要存储引用直接使用它,例如new Person().age
会给我人员年龄。这称为匿名对象。
答案 3 :(得分:0)
关于变量行为,C#中有两种类型:
值类型变量将实际对象作为其值。指定从另一个值类型变量指定的值类型变量复制整个对象。在C ++术语中,这就像使用类类型的变量(不是指向类的指针),例如,当您创建堆栈分配的实例时。但是,C#并没有给出您的选择,但仅将此行为限制为结构类型。
引用类型变量将对实际对象的引用作为其值。对实际对象的引用很可能至少涉及对象的内存地址(但是对您隐藏了详细信息)。从另一个引用类型变量中分配引用类型变量会复制引用,而不是对象,因此现在这两个变量指向同一个对象。在C ++术语中,这就像拥有类的指针变量一样。但是对于类和接口等类型的变量,C#默认为这种行为(据我所知,没有办法跳回到其他行为)。 C#引用和C ++指针之间的主要区别在于C ++指针支持算术,而C#引用则不支持算术。这是C#确保我们称之为内存安全的方式之一。 (C#确实提供了指针,但很少使用它们,很多时候它们在互操作性方案中很有用。在你需要在C#中使用指针之前可能需要很长时间。)
最后,您可以认为C#引用接近于C ++指针(但是,如上所述,存在差异,因为语言行为不同并且为您提供不同程度的控制和保护)。
答案 4 :(得分:0)
在问之前你有google吗?互联网上有许多顶级资源,还有一些不错的电子书。
但是,这里是C#中使用的内存模型(几乎在Java和PHP中):
编辑:
子类继承基类中的所有内容,也包括私有和受保护的成员/方法。但是您只能访问公共和受保护的成员/方法,除非您不使用反射。 / p>
希望,这有助于您更多地了解C#...
答案 5 :(得分:-2)
引用是指向对象的指针。
您可以在不安全的代码中使用C#中的“真实”指针:here is an example