Tag: 函数指针

如何在C#中实现C ++样式函数指针,而不使用委托

我正在学习C#中的指针,并且好奇如果可以在C#中使用C ++样式函数指针。 是的,我知道C#有自己的等效function指针概念(称为委托)。 但我只是想知道使用C#中的指针是否可以实现相同,而不使用委托。 如果在C#中使用指针完全合法(使用不安全选项)并且指针语义几乎与C / C ++类似,那么在我看来,也应该能够使用C / C ++样式函数指针。 请指导我这个。 可能吗? 如果是的话怎么样?如果不是那么为什么? 请注意C#和C / C ++中指针使用的相似性,如下例所示 /* Using pointers in C# (Very similar to C/C++) */ using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* let us […]

c#中的委托与c ++中的函数指针有什么区别?

可能重复: c#中有函数指针吗? 我有兴趣找到C#中的委托和C ++中的函数指针之间的区别。

将委托定义为函数指针

我正在使用一个调用非托管函数指针的委托。 这会导致垃圾收集器在使用之前收集它,如MSDN上的CallbackOnCollectedDelegate MDA页面中所述:CallbackOnCollectedDelegate MDA的MSDN页面 。 该决议声明我必须将适当的委托编组为非托管函数指针。 我最初的反应是使用: [MarshalAs(UnmanagedType.FunctionPtr)] public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity); 但是,C#编译器不会让我编组委托,即使这是MSDN建议的解决方案。 此外,MSDN页面仅显示抛出问题的示例,但不是解决方案之一。 我怎么能将我的委托编组为一个非托管函数指针或阻止它被GCed? 编辑 :根据建议,我创建了回调的引用。 因此,我的代码从/更改为: // From: foo.SetCallback(new EntityCallback(bar)); // To: call = new EntityCallback(bar); // Referenced in class foo.SetCallback(call); 现在这确实有效 – 但仅限于调试模式。 当我切换到Release时,它会在同一点崩溃。 这是为什么? 编辑2 :更完整的代码片段: public class Test { private EntityCallback Call; private void Bar(System.IntPtr target) { … […]

在C#中使用免费generics类型参数模拟委托

这是一个关于语言设计,模式和语义的难题。 请不要因为你没有看到实际价值而进行投票。 首先,让我们考虑一下函数及其参数。 然后我们将看看函数与其参数/参数和generics类/函数及其类型参数/类型参数之间的类比。 函数是代码块,带有一些未指定的值,称为“ 参数 ”。 您提供参数并接收结果。 generics类是具有一些未指定的“ 类型参数 ”的类。 您提供了类型参数 ,然后您可以使用该类 – 调用构造函数或调用静态方法。 非generics类中的generics函数是具有一些未指定的“ 类型参数 ”和一些未指定的“ 值参数 ” 的函数 。 您提供了type-arguments和value-arguments来接收结果。 代表是指向特定function的指针。 创建委托时,不要指定函数参数 ,而是稍后提供它们。 问题是.Net与具有未指定generics类型参数的generics函数没有等效的Delegates。 您以后不能为type-parameters提供类型值 。 我们可以想象代理不仅有自由值参数 ,还有自由类型参数 。 static class SomeClass { //generic function public static T GetValue() { return default(T); } } //creating delegate to generic function or method group […]

使用function指针的好处

我已经编程了几年,并且在某些情况下使用了函数指针。 我想知道的是,出于性能原因何时使用它们是合适的,我的意思是在游戏环境中,而不是商业软件。 函数指针很快,John Carmack在Quake和Doom源代码中使用了它们,因为他是天才:) 我想更多地使用函数指针,但我想在最合适的地方使用它们。 现在,在C,C ++,C#和Java等现代c风格语言中,函数指针的最佳和最实用的用途是什么?

C#P / Invoke:包含函数指针的编组结构

对不起,下面是详细的介绍。 我需要知道P / Invoke内部人员的洞察力比我更好。 这是我如何编组包含从C到C#的函数指针的结构。 我想知道这是否是最干净和/或最有效的方式。 我正在使用C编码的本机DLL连接,它提供以下入口点: void* getInterface(int id); 您必须传递getInterface(int)以下枚举值之一: enum INTERFACES { FOO, BAR }; 它返回一个指向包含函数指针的结构的指针,如: typedef struct IFOO { void (*method1)(void* self, int a, float b); void (*method2)(void* self, int a, float b, int c); } IFoo; 以下是您在C中使用它的方式: IFoo* interface = (IFoo*)getInterface(FOO); interface->method1(obj, 0, 1.0f); // where obj is an instance of […]

c#中有函数指针吗?

我正在尝试学习一些c#编码,并想知道函数指针的c ++概念是否包含在c#中。 我看到有代表这样的事情。 它们是相同的概念吗? 或者他们在更基础的层面上有所区别?

从c#调用c ++函数指针

是否可以像这样调用ac(++)静态函数指针(不是委托) typedef int (*MyCppFunc)(void* SomeObject); 来自c#? void CallFromCSharp(MyCppFunc funcptr, IntPtr param) { funcptr(param); } 我需要能够从c#回调到一些旧的c ++类。 C ++是受管理的,但类不是ref类(尚未)。 到目前为止,我不知道如何从c#调用c ++函数指针,这可能吗?