C#中对指针是如何定义的?为什么C#不太使用指针?
5个回答
展开全部
C#是没有指针的,如果一定要用,可以用C#中的委托(delegate),效果和函数指针相同
学习c#都会惊奇于它的delegate,其实delegate并没有太多神秘的地方,说的通俗点,delegate是类型化了的函数指针,它主要应用于回调。
学习c++的对函数指针都不回陌生,它是一个保存了函数地址的变量,但除了地址,它没有包含任何额外的信息,如参数的个数、参数类型和函数的返回地址等,所以函数指针是非类型安全的。而delegate对回调提供了类型的安全性,从而使我们在处理回调等问题的时候可以更加优美的面向对象的方式来编写代码,并且在CLR的内部对delegate的操作提供了许多支持(如delegate链表),简化了我们常用的操作。
在使用delegate的过程中,首先要定义一个delegate的类型,如:
public delegate void SomeFunction(Object a,int i,...);
note:它是一个类的定义,可以放在任何地方,此类型定义了此delegate所接收的函数的样式:返回void,参数列表...
然后,为了使用,要定义类SomeFunction的一个实例:
public SomeFunction instance;
接着,我们就可以往这个delegate实例中放“符合规范”的函数(可以为实例函数和静态函数)。
instance +=new SomeFunction(someObject.SomeMethod);
其中someObject为某类的一个实例,它的方面SomeMethod符合此委托的规范要求,否则将编译报错。
最后,可以直接调用instance实例来实现对someObject的SomeMethod的回调。
instance(...);
##########################
只是从上面的实现中,貌似看不出delegate真正存在的价值,但实际上delegate增加了对链的支持,我们可以象下面这样应用:
instance +=new SomeFunction(someObject.SomeMethod);
instance +=new SomeFunction(anotherObject.anotherMethod);
...
然后调用instance(...),可以同时激发所有注册自里面的回调函数。
这是怎样实现的,首先要研究delegate内在的结构,在每个delegate里面包括了三个字段:
target ——》指向回调函数所属的对象实例(对于实例方法来言)
method ——》指向回调函数
prev ——》指向另外一个delegate 实例
通过prev就可以比较方便的实现delegate对链的支持。
CLR定义了Delegate.Combine和Delegate.Remove静态方法实现对链表的操作。
学习c#都会惊奇于它的delegate,其实delegate并没有太多神秘的地方,说的通俗点,delegate是类型化了的函数指针,它主要应用于回调。
学习c++的对函数指针都不回陌生,它是一个保存了函数地址的变量,但除了地址,它没有包含任何额外的信息,如参数的个数、参数类型和函数的返回地址等,所以函数指针是非类型安全的。而delegate对回调提供了类型的安全性,从而使我们在处理回调等问题的时候可以更加优美的面向对象的方式来编写代码,并且在CLR的内部对delegate的操作提供了许多支持(如delegate链表),简化了我们常用的操作。
在使用delegate的过程中,首先要定义一个delegate的类型,如:
public delegate void SomeFunction(Object a,int i,...);
note:它是一个类的定义,可以放在任何地方,此类型定义了此delegate所接收的函数的样式:返回void,参数列表...
然后,为了使用,要定义类SomeFunction的一个实例:
public SomeFunction instance;
接着,我们就可以往这个delegate实例中放“符合规范”的函数(可以为实例函数和静态函数)。
instance +=new SomeFunction(someObject.SomeMethod);
其中someObject为某类的一个实例,它的方面SomeMethod符合此委托的规范要求,否则将编译报错。
最后,可以直接调用instance实例来实现对someObject的SomeMethod的回调。
instance(...);
##########################
只是从上面的实现中,貌似看不出delegate真正存在的价值,但实际上delegate增加了对链的支持,我们可以象下面这样应用:
instance +=new SomeFunction(someObject.SomeMethod);
instance +=new SomeFunction(anotherObject.anotherMethod);
...
然后调用instance(...),可以同时激发所有注册自里面的回调函数。
这是怎样实现的,首先要研究delegate内在的结构,在每个delegate里面包括了三个字段:
target ——》指向回调函数所属的对象实例(对于实例方法来言)
method ——》指向回调函数
prev ——》指向另外一个delegate 实例
通过prev就可以比较方便的实现delegate对链的支持。
CLR定义了Delegate.Combine和Delegate.Remove静态方法实现对链表的操作。
2011-08-04
展开全部
数据类型 * 指针名;C#中没有指针……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C#中指针的定义和使用与C++基本相同,不太使用指针可能时因为不安全或者有替代办法。
下面答案写了很多的那位说C#没有指针是完全错误的,C#指针属于不安全代码,要在unsafe代码块中使用,VS默认关闭了它,需要手动设置。
下面答案写了很多的那位说C#没有指针是完全错误的,C#指针属于不安全代码,要在unsafe代码块中使用,VS默认关闭了它,需要手动设置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c#.的指针是非常常用的,特别是与native dll进行通讯,以及进行流信息处理,指针都是不可或缺的,要改变指针困难,不敢用的观点,适当的用指针来优化程序,提高运行效率
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用指针还要C#干啥?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |