c#中的引用和调用的区别
引用一般就是一个指针,它指向一个实体的物理内存。通常C#中除了值类型的对象之外所有的对象都是引用类型。也就是说当你调用一个引用类型的对象的时候,它会将自己指向的地址传递给你,然后根据地址去做你想做的事情。
例如: Object obj = new Object();
obj = new Object();
上面这个语句中,Object obj的意思就是创建一个Object类型的引用类型对象obj,其实这个obj只是一个指针,系统会在内存中创建一个对象堆栈专门存放这种指针。而new Object()做的是在内存中开辟一块内存空间实际存放一个对象。然后 = 号将指针obj指向由new Object()开辟的这个内存控件。第二个语句中又使用了new Object()创建了一个新的Object类型的内存控件,这个空间是全新的,然后又将obj的指针指向了新的这个内存。在这里 obj对象就是一个引用其实就是一个指针。
调用是一个动作,是对象与对象之间交互的时候,互相做的动作。因此引用和调用不是同一类东西。一般来说当一个类使用到本类或者其他类内部的对象、字段、事件、方法、属性等的时候就叫调用,相当于将别人的东西拿过来用。
例如:
public Class A
{
public void SetA()
{
}
}
public Class B
{
public void Operation()
{
A a = new A();
a.SetA();
}
}
上面这个例子中在B的Operation方法中创建了一个A对象,然后a.SetA(),就是一次调用的动作。
记住调用永远都是一个动作,而引用只是一个指针。这里要明确一点"调用"是一个动词,而"引用"你要理解成一个名次它等与"指针"。这样就可以了。
C#值类型和引用类型的区别
值类型:
单元直接存放“有效值”
如:
int a=3;
则a内存单元就放的是3
引用类型:
单元放的是另外一个对象的引用(地址)
如:
Form form1=new Form();
就是说,在内存中开辟了一个对象new Form(),form1内存单元存放的是那个对象的地址,并非对象本身
C# 支持两种变量类型:
• 值类型 — 这些是内置的基本数据类型,例如 char、int、float等基本数据类型(string除外) 、枚举以及用 struct 声明的用户定义类型。
• 引用类型 — 从基本类型构造而来的类和其他复杂数据类型。如:类、接口、数组和字符串。这种类型的变量并不包含类型的实例,而只是包含对实例的引用。
值类型和引用类型的区别在于他们在内存中的存储方式,值类型存贮在栈中,引用类型的内存单元中只存放对象的地址,而对象本身存贮在内存堆中。
值类型在内存中引用的时候会在堆栈中创建一个全新的副本,而不是简单的引用;而引用类型只是简单的引用对象的地址