You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:02:37