如何在三元运算符中使用 void 函数(不同参数)调用或在 1 行中编写 if-else

How can use void functions (different parameters) call in ternary operator or write if-else in 1 line

我正在使用 unity2019.2.0b 和 c# 语言。

当我创建对象并通过脚本更改对象的属性时,例如缩放旋转位置或速度

在我的例子中,使用 if-else 语句工作正常,但我想使用三元运算符,因为每个属性设置每 1 行脚本以提高可读性。

所以我的问题是如何将 if else 语句转换为没有 return 值函数的三元运算符

我想要的概念是检查 movable 是否为真

所有函数都不是 return 值函数。

我想这样写(movable是boolean)

movable? SetObjectMoving(gameobject) : RemoveComponent<MoveComponent>(gameobject);

这是使用if-else语句时的代码

if(movable)
{
ObjectMovingSystem(gameobject);
}else{
RemoveComponent<MoveComponent>(gameobject);
}

这是我的完整代码

    private void CreateEntity()
    {

        for (int i = 0; i < spawnCountPerFrame; i++)
        {
            Entity instance = shapeFactory.GetEntityRandom();
            entityManager.SetComponentData<Translation>(instance, new Translation { Value = SpawnZoneOfLevel.SpawnPoint });
            entityManager.SetComponentData<Rotation>(instance, new Rotation { Value = Random.rotation });
            entityManager.SetComponentData<Scale>(instance, new Scale { Value = Random.Range(0.1f, 1f) });
            //(movable ? SetEntityMovement(instance) : RemoveMovementComponent<PersistantObjectMovement>(instance));

            //PersistantObjectmovement
            if (movable)
            {
                SetEntityMovement(instance);
            }
            else
            {
                RemoveMovementComponent<PersistantObjectMovement>(instance);
            }

            //(rotatable ? SetEntityRotation(instance) : RemoveMovementComponent<PersistantObjectRotation>(instance));
            //PersistantObjectRotation
            if (rotatable)
            {
                SetEntityRotation(instance);
            }
            else
            {
                RemoveMovementComponent<PersistantObjectRotation>(instance);
            }


            entityList.Add(instance);
        }
    }


    private void SetEntityMovement(Entity instance)
    {
        entityManager.SetComponentData(instance, new PersistantObjectMovement
        {
            direction = Random.onUnitSphere,
            speed = Random.Range(0.5f, 1)
        });
    }
    private void SetEntityRotation(Entity instance)
    {
        entityManager.SetComponentData(instance, new PersistantObjectRotation
        {
            angularVelocity = Random.onUnitSphere * Random.Range(0f, 90f),
            radiantPerSecond = math.radians(Random.Range(120f, 360f))
        });
    }

    private void RemoveMovementComponent<T>(Entity instance) where T : IComponentData
    {
        entityManager.RemoveComponent(instance, typeof(T));
    }

我知道这不是真的有必要做,但我想知道有什么方法可以像三元运算符那样写 if-else 语句写 1 行?

我想这符合条件:P

if (movable) SetEntityMovement(instance); else RemoveMovementComponent<PersistantObjectMovement>(instance);

我认为没有三元风格的运算符。我可能会选择带大括号的普通 if-else。

我认为你的意思是三元运算符而不是三元运算符。

三元运算符用于 return 一个值,如果您不使用它们来 return 一个值,您就是在滥用它们。换句话说,如果阅读您的代码的人看到一个三元运算符,他可以期望该操作 return 一个值。

如果您使用三元运算符而不是 if 语句只是为了有条件地执行代码,那么您会使代码的可读性降低而不是提高可读性。

这不起作用的原因是三元运算符需要知道 return 类型才能编译。它通过查看“?”后面的子句的 return 类型来做到这一点。 void 方法没有 return 类型,因此三元运算符的编译将无法尝试获取 return 类型。

@steve16351 给了我好主意。

使用我想要的 1 行三元运算符。

        Entity instance = shapeFactory.GetEntityRandom();
        entityManager.SetComponentData<Translation>(instance, new Translation { Value = SpawnZoneOfLevel.SpawnPoint });
        entityManager.SetComponentData<Rotation>(instance, new Rotation { Value = Random.rotation });
        entityManager.SetComponentData<Scale>(instance, new Scale { Value = Random.Range(0.1f, 1f) });
        (movable ? (Action<Entity>)SetEntityMovement : RemoveMovementComponent<PersistantObjectMovement>)(instance);
        (rotatable ? (Action<Entity>)SetEntityRotation : RemoveMovementComponent<PersistantObjectRotation>)(instance);

你们觉得这段代码怎么样?

如果你真的想这样做,你可以使用:

(movable ? (Action<bool>)SetEntityMovement : RemoveMovementComponent<PersistantObjectMovement>)(instance)