调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)? 应该有类似c++中的this指针,否则这样的构造函数就有可能出错private string str;public ctor(string str){ str=str //错误 this.str=str; }就是说有默认的this 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 >>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?应该是一样的。>>我想搞到关于C#类实例内存布局的资料,请问这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。具体说说,我们讨论讨论。 最初我也认为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++比较好:即优美又公开。 看看jeffery richter写的那个.net书的也有会又帮助。 >>调用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 yarshray(saga jion(心飘情落))受益匪浅:) 父表主键为标识列自动生成,如何在Update时填到对应的子表外键中。 一个关于SQL语句问题 这种情况如何解决啊? 我想做一个从屏幕右边向左走的动态曲线,请问用什么方法好呢? 更新记录时出错!郁闷!帮忙看一下!谢 如何把Dt.Columns["Name"] 这一列转换为string[]? 在不调用madie player这个控件,怎么写快进和慢放 问个关于Encoding的问题 请问大家一个邮件的问题,急,分不够再加 怎样用C#实现语法加亮? 超级郁闷中啊,在线等 我的vs.net7 一想要输入中文,刚调出输入法. vs就没反应了?
应该是一样的。>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。具体说说,我们讨论讨论。
后来看到委托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++比较好:即优美又公开。
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.
>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则OOPL!=OOP