C#参数传递时到底发生了什么
来源:互联网 发布:java post上传文件 编辑:程序博客网 时间:2024/04/30 03:10
1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。
unsafe
class
Program
{
static
void
Main(
string
[] args)
{
Employee myE =
new
Employee() { id=4};
fixed
(
int
* pId=&(myE.id))
{
Console.WriteLine(
"方法执行前,myE中id的地址为0x{0:X},值为{1}"
, (
uint
)&(*pId), (
uint
)*pId);
}
testMethod(myE);
fixed
(
int
* pId = &(myE.id))
{
Console.WriteLine(
"方法执行后,myE中id的地址为0x{0:X},值为{1}"
, (
uint
)&(*pId), (
uint
)*pId);
}
Console.ReadLine();
}
static
void
testMethod(Employee myE)
{
myE.id = 5;
//myE = new Employee() { id = 5 };
fixed
(
int
* pId = &(myE.id))
{
Console.WriteLine(
"方法执行中,myE中id的地址为0x{0:X},值为{1}"
, (
uint
)&(*pId), (
uint
)*pId);
}
}
}
输出为:
方法执行前,myE中id的地址为0x1AF5BE0,值为4方法执行中,myE中id的地址为0x1AF5BE0,值为5方法执行后,myE中id的地址为0x1AF5BE0,值为5
执行过程为:
1) 在堆中新建对象myE,在栈中建立指向myE的指针
2) 按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE
如下图所示:
2、 如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。
unsafe
class
Program
{
static
void
Main(
string
[] args)
{
Employee myE =
new
Employee() { id=4};
fixed
(
int
* pId=&(myE.id))
{
Console.WriteLine(
"方法执行前,myE中id的地址为0x{0:X},值为{1}"
, (
uint
)&(*pId), (
uint
)*pId);
}
testMethod(myE);
fixed
(
int
* pId = &(myE.id))
{
Console.WriteLine(
"方法执行后,myE中id的地址为0x{0:X},值为{1}"
, (
uint
)&(*pId), (
uint
)*pId);
}
Console.ReadLine();
}
static
void
testMethod(Employee myE)
{
//myE.id = 5;
myE =
new
Employee() { id = 5 };
fixed
(
int
* pId = &(myE.id))
{
Console.WriteLine(
"方法执行中,myE中id的地址为0x{0:X},值为{1}"
, (
uint
)&(*pId), (
uint
)*pId);
}
}
}
输出为:
方法执行前,myE中id的地址为0x1E77BE0,值为4方法执行中,myE中id的地址为0x1E78E24,值为5方法执行后,myE中id的地址为0x1E77BE0,值为4
执行过程为:
1) 在堆中新建对象myE,在栈中建立指向myE的指针
2) 按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE
3) 方法中new一个新对象时,在堆中新建对象,并把地址传给指针2
- C#参数传递时到底发生了什么
- C#参数传递时到底发生了什么(ref)
- C#参数传递时到底发生了什么二(ref)
- 函数调用时,栈里到底发生了什么?
- 运算符重载时到底发生了什么?【DEBUG】
- Android在横竖屏切换时到底发生了什么?
- ResultSet.TYPE_SCROLL_SENSITIVE到底发生了什么?
- (++a)+=(a++)到底发生了什么
- Measure(0,0)到底发生了什么
- 这几年,互联网到底发生了什么
- 网页打开过程到底发生了什么
- 震撼!这群人已经先富了,到底发生了什么?
- linux 终端下敲ctrl-c时,到底发生了什么?
- WorkerMan学习篇:连接mysql时到底发生了什么鬼
- 不同种类的整型比较,到底发生了什么?
- .NET 3.5框架中到底发生了什么巨变?
- Linux Kernel驱逐Android:到底发生了什么
- [转载]一个浏览器访问请求到底发生了什么
- android+unity游戏开发之常用的属性
- const的思考
- 片上总线Wishbone 学习(十二)总线周期之块写操作
- Bada学习-(三十三) C++以及Flash应用开发流程之创建应用工程
- 我是為何!!!
- C#参数传递时到底发生了什么
- Java正则表达式入门(1)
- 标准分
- Java正则表达式入门(2)
- Linux驱动编程 step-by-step (六)
- Java正则表达式入门(3)
- c语言,功能简单的电话簿,实现输入,显示,查找的功能
- VS2005中的条件断点和内存监测
- C++ win32工程如何封装成DLL。