我有一个struct
存储在一个readonly
字段中,嵌套在几级对象中(全部在我无法控制的代码中),我正在一个函数中访问它。例如:
struct Surprise { public readonly int a, b, c; }
struct Gizmo { public readonly Surprise surprise; }
struct Bobble { public readonly Gizmo gizmo; }
struct Thing { public readonly Bobble bobble; }
class Gift { public readonly Thing thing; }
void Function (Gift gift) {
int contrived = gift.thing.bobble.gizmo.surprise.a +
gift.thing.bobble.gizmo.surprise.b +
gift.thing.bobble.gizmo.surprise.c;
}
纯粹是为了避免gift.thing.bobble.gizmo.surprise
每次使用时都必须输入,我想将其分配给名称较短的局部变量。但是,我也不需要复制结构,所以我想避免这种情况:
void Function (Gift gift) {
{ // (A) this is what i'm trying to not type out:
int contrived = gift.thing.bobble.gizmo.surprise.a +
gift.thing.bobble.gizmo.surprise.b +
gift.thing.bobble.gizmo.surprise.c;
}
{ // (B) i can do this, but i don't *need* to copy, so i'd like to avoid:
Surprise s = gift.thing.bobble.gizmo.surprise;
int contrived = s.a * s.b + s.c;
}
{ // (C) what i *want* to do is something like this:
ref Surprise s = ref gift.thing.bobble.gizmo.surprise;
int contrived = s.a * s.b + s.c;
}
}
但是,似乎不允许出现变体(C),因此无法编译:
CS0192 A readonly field cannot be used as a ref or out value
(except in a constructor)
我的问题是:有没有办法创建一个引用只读值类型字段并且不复制它的局部变量(或其他一些方法来节省自己的一些输入)?
我是 C# 的新手,来自 C++。如果您熟悉 C++,我实际上是在寻找以下等价物:
const Surprise &s = gift->thing.bobble.gizmo.surprise;
另外:它甚至会有所作为,还是编译器足够聪明,不会在上面的 (B) 中创建副本?
顺便说一句,经过一番挣扎,我确实想出了这个噩梦:
delegate void Hack (in Surprise s);
void Function (Gift gift) {
((Hack)((in Surprise s) => {
int contrived = s.a + s.b + s.c;
...;
}))(gift.thing.bobble.gizmo.surprise);
}
不过,出于显而易见的原因,我对此并不感兴趣。此外,我实际上不确定这是否甚至可以避免复制。