在将参数从C#传递到C++时,使用[In,Out]和仅使用ref之间有区别吗?我发现了几个不同的SO帖子,以及来自MSDN的一些内容,这些内容与我的问题很接近,但没有完全回答。我的猜测是我可以像使用[In,Out]一样安全地使用ref,并且编码器的行为不会有任何不同。我担心的是它的行为会有所不同,并且C++不会对传递我的C#结构感到满意。我已经在我正在使用的代码库中看到了这两件事...以下是我找到并一直在阅读的帖子:AreP/Invoke[In,Out]attributesoptionalformarshalingarrays?让我觉得我应该使用[In,Out]。MSDN:InAttr
在C#中,通过引用传递是:voidMyFunction(refDogdog)但在我目前看到的C++/CLI代码示例中,没有使用ref而是使用了^符号:voidMyFunction(Dog^dog)参数传递时使用^符号是不是可以直接代替ref?还是有其他我不知道的含义?附加问题:我也看到了很多:Dog^myDog=gcnewDog();它看起来像C++中的*(指针)一样使用。它的工作方式类似吗?谢谢! 最佳答案 如果Dog是引用类型(在C#中为class),则C++/CLI等效项为:voidMyFunction(Dog^%dog)如果
在C#中,通过引用传递是:voidMyFunction(refDogdog)但在我目前看到的C++/CLI代码示例中,没有使用ref而是使用了^符号:voidMyFunction(Dog^dog)参数传递时使用^符号是不是可以直接代替ref?还是有其他我不知道的含义?附加问题:我也看到了很多:Dog^myDog=gcnewDog();它看起来像C++中的*(指针)一样使用。它的工作方式类似吗?谢谢! 最佳答案 如果Dog是引用类型(在C#中为class),则C++/CLI等效项为:voidMyFunction(Dog^%dog)如果
假设我有以下代码:voidMain(){inta=5;f1(refa);}publicvoidf1(refinta){if(a>7)return;a++;f1(refa);Console.WriteLine(a);}输出是:888即当堆栈展开时,ref参数的值将保持不变。这是否意味着将ref关键字添加到int参数会导致它被装箱?在递归调用期间实际堆栈看起来如何? 最佳答案 通过引用传递值类型会导致传递其在堆栈上的位置,而不是值本身。它与装箱和拆箱无关。这使得思考堆栈在递归调用期间的外观变得相当容易,因为每个调用都指向堆栈上的“相同”
假设我有以下代码:voidMain(){inta=5;f1(refa);}publicvoidf1(refinta){if(a>7)return;a++;f1(refa);Console.WriteLine(a);}输出是:888即当堆栈展开时,ref参数的值将保持不变。这是否意味着将ref关键字添加到int参数会导致它被装箱?在递归调用期间实际堆栈看起来如何? 最佳答案 通过引用传递值类型会导致传递其在堆栈上的位置,而不是值本身。它与装箱和拆箱无关。这使得思考堆栈在递归调用期间的外观变得相当容易,因为每个调用都指向堆栈上的“相同”
下面引用返回的例子来自What’sNewinC#7.0:publicrefintFind(intnumber,int[]numbers){for(inti=0;i编译没有任何问题(正如您所期望的那样,因为它是从Microsoft博客复制的)。我写过这个:privatestaticrefintGetReference(stringsearchTerm){varpasswords=newDictionary{{"password",1},{"123456",2},{"12345678",3},{"1234",4},{"qwerty",5},{"12345",6},{"dragon",7}}
下面引用返回的例子来自What’sNewinC#7.0:publicrefintFind(intnumber,int[]numbers){for(inti=0;i编译没有任何问题(正如您所期望的那样,因为它是从Microsoft博客复制的)。我写过这个:privatestaticrefintGetReference(stringsearchTerm){varpasswords=newDictionary{{"password",1},{"123456",2},{"12345678",3},{"1234",4},{"qwerty",5},{"12345",6},{"dragon",7}}
C#有内置委托(delegate)Action和Func.是否可以为此代表使用“ref”类型的参数?例如,这段代码:publicdelegatevoidDTest(refGuida);publiceventDTestETest;将编译。但是如果我使用Action,它不会编译:publiceventActionETest;有什么提示吗? 最佳答案 不,您不能对Action委托(delegate)使用按引用传递。虽然在框架中有作为Type的“通过引用传递的类型”的概念,但就C#而言,它并不是真正意义上的类型。ref是参数的修饰符,不是类
C#有内置委托(delegate)Action和Func.是否可以为此代表使用“ref”类型的参数?例如,这段代码:publicdelegatevoidDTest(refGuida);publiceventDTestETest;将编译。但是如果我使用Action,它不会编译:publiceventActionETest;有什么提示吗? 最佳答案 不,您不能对Action委托(delegate)使用按引用传递。虽然在框架中有作为Type的“通过引用传递的类型”的概念,但就C#而言,它并不是真正意义上的类型。ref是参数的修饰符,不是类
我做了一些ref关键字测试,但有一件事我无法理解:staticvoidTest(refinta,refintb){Console.WriteLine(Int32.ReferenceEquals(a,b));}staticvoidMain(string[]args){inta=4;Test(refa,refa);Console.ReadLine();}为什么这段代码显示False?我知道int是一个值类型,但在这里它应该传递对同一对象的引用。 最佳答案 WhydoesthiscodedisplayFalse?因为inta和intbar