如何在C#中为局部变量条件分配另一变量的引用
在C#中实现不复制结构体的条件引用
你要实现的C/C++逻辑如下,核心是直接引用两个结构体变量中的一个,避免不必要的复制:
bool MyFunc(eMyType t) { sMyStruct* s=(t==TypeX) ? &VarMyStructX : &VarMyStructY; if (s->dataneeded>0) return true; return false; }
但你尝试的几种C#写法都存在编译错误:
public bool MyFunc(in eMyType t) { // 错误:无法用值初始化引用类型变量 ref sMyStruct s=(t==eMyType.TypeX) ? ref VarMyStructX : ref VarMyStructY; // 错误:ref/out参数必须是可赋值的变量 ref sMyStruct s=ref ((t==eMyType.TypeX) ? VarMyStructX : VarMyStructY); // 错误:只能在fixed语句初始化器中获取未固定表达式的地址 sMyStruct* s=(t==TypeX) ? &VarMyStructX : &VarMyStructY; if (s.dataneeded > 0) return true; return false; }
正确实现方式
推荐用ref关键字结合条件分支来实现,完全避免结构体复制,直接引用原变量:
方法1:if-else分支赋值ref变量
这种写法兼容性好,清晰直观:
public bool MyFunc(in eMyType t) { ref sMyStruct targetStruct; if (t == eMyType.TypeX) { targetStruct = ref VarMyStructX; } else { targetStruct = ref VarMyStructY; } return targetStruct.dataneeded > 0; }
方法2:ref三元运算符(C# 7.2+)
如果你的项目使用C# 7.2及以上版本,可以直接用ref三元表达式,代码更简洁:
public bool MyFunc(in eMyType t) { ref sMyStruct targetStruct = ref (t == eMyType.TypeX ? ref VarMyStructX : ref VarMyStructY); return targetStruct.dataneeded > 0; }
方法3:unsafe指针方式(不推荐)
如果一定要用指针,需要开启unsafe模式并通过fixed语句固定结构体地址(防止GC移动):
public unsafe bool MyFunc(in eMyType t) { fixed (sMyStruct* ptrX = &VarMyStructX, ptrY = &VarMyStructY) { sMyStruct* targetPtr = t == eMyType.TypeX ? ptrX : ptrY; return targetPtr->dataneeded > 0; } }
说明
- 前两种ref方式无需unsafe权限,是C#中处理结构体引用的原生安全方案,完全不会复制结构体。
- 指针方式需要项目开启unsafe支持,且代码复杂度更高,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

