Efr*_*ain 10 .net c# ref params
I want to do something like this:
double a, b, c, d, e;
ParseAndWrite("{1, 2, 3}", ref a, ref b, ref c);
ParseAndWrite("{4, 5}", ref d, ref e);
-> a = 1, b = 2, c = 3, d = 4, e = 5
Run Code Online (Sandbox Code Playgroud)
However, I can not write a function like this:
private void ParseAndWrite(string leInput, params ref double[] targets)
{
(...)
}
Run Code Online (Sandbox Code Playgroud)
This doesn't work, for some reason one can not use ref and params at the same time. Why so?
edit: OK, here's some more information on why I need this: Through an Interface I get a lot of strings containing values, with a syntax like this:
inputConfig : " step, stepHeight, rStep, rStepHeight, (nIterations, split, smooth) "
outputConfig : " dataSelection, (corrected, units, outlierCount, restoreOriginalRange) "
Run Code Online (Sandbox Code Playgroud)
(names in brackets are optional). Those values need to be parsed and stored in all specific variables. That is - they are not arrays at all. They are more like command-line arguments, but around 20 of them. I can of course do all that sequencially, but that produces hundreds of lines of code that contain a redundant pattern and are not well maintainable.
Eri*_*ert 16
由于某种原因,人们不能同时使用ref和params.为什么这样?
考虑相机的这三个理想特征:
轻量级
高品质镜头
便宜
任何相机中最多可以有两个.你永远不会得到这三个.您可以购买便宜的重型大镜头相机,或昂贵的轻型大镜头相机,或便宜的轻型快照相机,但没有廉价,轻便的相机和大镜头.
现在回到你的问题.考虑运行时的这三个理想特征:
ref-to-variable类型的param数组是合法的
类型系统是安全的
已经引用它们的局部变量仍然可以快速分配和解除分配
你有任何两个,但你不能拥有这三个.你想要哪两个?
您可以使用ref param数组和安全类型系统,代价是在垃圾收集堆上分配ref的局部变量.据我所知,没有人这样做,但肯定是可能的.
您可以使用ref param数组,在临时池上分配的所有局部变量,以及在使用错误时崩溃的类型系统.这是"C/C++"方法; 可以获取引用并将其存储在生命周期比被引用事物的生命周期更长的位置.如果你这样做,你可能会让你的C++程序崩溃,并以最可怕的方式死掉,因为容易犯下难以发现的错误.欢迎来到绝望之坑.
或者我们可以使ref param数组非法,在临时池上分配所有局部变量,并拥有一个可验证内存安全的类型系统.这是我们在构建C#和CLR时所做的选择; 欢迎来到质量的坑.
现在,我上面所说的实际上是一个很大的谎言.这是一个谎言,因为运行时和C#语言,实际上也支持类似(但不完全相同)参数裁判的阵列功能.这是一个愉快的谎言,相信我,你想生活在你相信谎言的世界,所以我建议你服用蓝色药丸并继续这样做.
如果您想要获取红色药丸并找出兔子洞的深度,您可以使用__arglistC#的未记录特征来构建C风格的可变方法,然后创建TypedReference引用任意字段或结构本地的引用的对象类型,然后将其中任意多个传递给可变方法.使用C#的工厂方法TypedReference或未记录的__makeref功能.
我们在过去十年中保留这些功能未被记录的原因是因为它们在设计上仅用于极少数情况,在这种情况下,您必须编写与其他语言编写的可变方法完全互操作的C#代码.
正确使用TypedReference物体不适合胆小的人,我强烈建议不要这样做.在编写C#多年的时间里,我从未在生产代码中这样做过.如果要传递对任意多个变量的引用,请传递一个数组.根据定义,数组是变量的集合.这比传递表示实例或局部变量的托管地址的一堆对象更安全.