调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?

时间:2023-02-16 22:17:27
请问C#老手:
调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?如果没有,它是怎样实现的。我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?

7 个解决方案

#1


强烈关注!

#2


应该有类似c++中的this指针,否则这样的构造函数就有可能出错

private string str;

public ctor(string str)
{
  str=str //错误
  this.str=str;
  
}
就是说有默认的this

#3


>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
应该是一样的。

>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。

具体说说,我们讨论讨论。

#4


最初我也认为C#和C++一样,compiler会在非静态成员函数中插入this指针,
后来看到委托delegate,觉得可能和C++有些不同:
ex: 
    delegate void MyDelegate();
class CFoo1
{
public void foo();
}

class CFoo2
{
public void foo();
}

class MainClass
{
static void Main()
{   
  MyDelegate myD;
  CFoo1 foo1 = new CFoo1();
  CFoo2 foo2 = new CFoo2();  
  myD += new MyDelegate(foo1.foo);
  myD += new MyDelegate(foo2.foo);
  myD();
}
}
这里可能有两种情况:
1,delegate 只是一个简单的函数指针数组,为保证CFoo1::foo和CFoo2::foo的原型相同,
没有将this指针作为隐含参数,由于C#代码时委托执行的中间代码,运行时平台可能用其它的
技术实现成员函数的调用;

2,delegate是一个带类型参数(模板)的函数指针数组,this指针作为成员函数的隐含参数。
这些都只能是猜测,关于C#和.Net Framework比较低层的资料太少了,感觉不能把握他,
还是C++比较好:即优美又公开。

#5


看看jeffery richter写的那个.net书的也有会又帮助。

#6


>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.


>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述

>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]

另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业

资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发

图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用

太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则

OOPL!=OOP

#7


yarshray(saga jion(心飘情落))

受益匪浅:)

#1


强烈关注!

#2


应该有类似c++中的this指针,否则这样的构造函数就有可能出错

private string str;

public ctor(string str)
{
  str=str //错误
  this.str=str;
  
}
就是说有默认的this

#3


>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
应该是一样的。

>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。

具体说说,我们讨论讨论。

#4


最初我也认为C#和C++一样,compiler会在非静态成员函数中插入this指针,
后来看到委托delegate,觉得可能和C++有些不同:
ex: 
    delegate void MyDelegate();
class CFoo1
{
public void foo();
}

class CFoo2
{
public void foo();
}

class MainClass
{
static void Main()
{   
  MyDelegate myD;
  CFoo1 foo1 = new CFoo1();
  CFoo2 foo2 = new CFoo2();  
  myD += new MyDelegate(foo1.foo);
  myD += new MyDelegate(foo2.foo);
  myD();
}
}
这里可能有两种情况:
1,delegate 只是一个简单的函数指针数组,为保证CFoo1::foo和CFoo2::foo的原型相同,
没有将this指针作为隐含参数,由于C#代码时委托执行的中间代码,运行时平台可能用其它的
技术实现成员函数的调用;

2,delegate是一个带类型参数(模板)的函数指针数组,this指针作为成员函数的隐含参数。
这些都只能是猜测,关于C#和.Net Framework比较低层的资料太少了,感觉不能把握他,
还是C++比较好:即优美又公开。

#5


看看jeffery richter写的那个.net书的也有会又帮助。

#6


>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.


>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述

>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]

另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业

资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发

图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用

太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则

OOPL!=OOP

#7


yarshray(saga jion(心飘情落))

受益匪浅:)