在Swift中,结构和值类型默认按值传递,就像在C#中一样。但是C#也有一个非常有用的ref关键字,它强制通过引用传递参数,这样同一个实例就可以在函数内部更改,然后可以从调用者的范围访问。有没有办法在Swift中实现相同的结果? 最佳答案 对函数参数使用inout限定符。funcswapTwoInts(a:inoutInt,b:inoutInt){lettemporaryA=aa=bb=temporaryA}swapTwoInts(&someInt,&anotherInt)参见FunctionParametersandReturnV
我鄙视out和ref作为方法的参数。恕我直言,它们使代码变得不那么干净,并为产生副作用提供了机会。但我承认我可能不明白它们的用处,这可能解释了我厌恶的部分原因。拜托,有人可以解释out或ref的有效案例吗? 最佳答案 基本上,如果您需要返回多个值,可以使用类似Tuple的替代方法或用于封装值的自定义类型。典型的例子可能是int.TryParse及相关方法。他们想传回两条信息:解析值是否解析成功。现在这些可以实际上是使用返回类型int?编写的在这种情况下等等,但对于其他情况也是一样的原则。(例如Dictionary.TryGetVal
假设我有一个Person类并且有以下内容:PersonA=newPerson("Tom");PersonB=A;有没有办法改变它,如果我将一个新的Person分配给B,B=newPerson("Harry"),A也指的是同一个实例吗?我知道您可以在函数的ref参数赋值中做到这一点。 最佳答案 更新:此处描述的功能已添加到C#7。您想要的功能称为“reflocals”,C#不支持它。CLR确实支持生成包含reflocals的代码,几年前我编写了一个具有您想要的功能的实验性C#版本,只是想看看它是否可行。你可以这样做:Persona=w
C#有一个ref关键词。使用ref可以通过引用将int传递给方法。当你调用一个通过引用接受int的方法时,堆栈帧上发生了什么?publicvoidSampleMethod(refinti){} 最佳答案 将局部变量作为引用传递在底层,引用的局部int变量将被放入栈中(大多数情况下整数存储在寄存器中),指向栈的指针将被传递给被调用的函数(指针本身最有可能在寄存器中传递)。考虑以下示例:vari=7;Console.WriteLine(i);inc(refi);Console.WriteLine(i);这将是JIT-et这样的东西(目标
关于“ref”和“out”参数的定义已经有很多问题,但它们看起来像是糟糕的设计。在某些情况下,您认为ref是正确的解决方案吗?似乎您总能做一些更干净的事情。谁能给我举个例子,说明在什么情况下这是解决问题的“最佳”方法? 最佳答案 在我看来,ref在很大程度上弥补了声明新实用程序类型的困难以及将信息“添加到”现有信息的困难,这些是C#自从它起源于LINQ、泛型和匿名类型。所以不,我认为它不再有很多明确的用例。我认为这在很大程度上是该语言最初设计方式的遗留问题。我确实认为在需要从函数返回某种错误代码以及返回值的情况下它仍然有意义(如上所
非常简单。MSDN声明您可以使用ref,但不能使用部分方法。我很好奇为什么?据我了解,当代码被编译时,部分被合并,那么限制是什么?partial除了让代码文件更清晰、更有条理(即养眼)之外,还有更多的东西吗?引用:MSDNArticle-“部分方法可以有ref但不能有out参数。” 最佳答案 您必须考虑如果未实现分部方法会发生什么情况。然后发生的是所有对该方法的调用都被删除,就好像它们从未发生过一样。所以对于使用out的方法,它看起来像这样:streams;GetStream(outs);s.Write(...);并被编译成这样:s
在RhinoMocks中,您可以将模拟作为一揽子声明告知IgnoreArguments。在Moq中,您似乎必须为每个参数指定It.IsAny()。但是,这不适用于ref和out参数。如何在需要最小化内部服务调用以返回特定结果的地方测试以下方法:publicvoidMyMethod(){//DoStuffIListerrors=newList();varresult=_service.DoSomething(referrors,refparam1,param2);//Domorestuff}测试方法:publicvoidTestOfMyMethod(){//SetupvarmoqServ
我一直以为类类型的方法参数默认是作为引用参数传递的。显然情况并非总是如此。在C#中考虑这些单元测试(使用MSTest)。[TestClass]publicclassSandbox{privateclassTestRefClass{publicintTestInt{get;set;}}privatevoidTestDefaultMethod(TestRefClasstestClass){testClass.TestInt=1;}privatevoidTestAssignmentMethod(TestRefClasstestClass){testClass=newTestRefClass(
我有一个方法,它有一个返回多个记录的out参数。我想知道如何使用FakeItEasy模拟它。 最佳答案 您应该使用.AssignsOutAndRefParameters配置方法:[Test]publicvoidOutput_and_reference_parameters_can_be_configured(){varfake=A.Fake>();stringignored=null;A.CallTo(()=>fake.TryGetValue("test",outignored)).Returns(true).AssignsOutA
为什么禁止使用ref修饰符调用ExtensionMethod?这是可能的:publicstaticvoidChange(refTestClasstestClass,TestClasstestClass2){testClass=testClass2;}而这个不是:publicstaticvoidChangeWithExtensionMethod(thisrefTestClasstestClass,TestClasstestClass2){testClass=testClass2;}但为什么呢? 最佳答案 您必须明确指定ref和out。