如何在三元运算符中使用 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 是否为真
如果为真则调用 function1(parameter1)
如果 false 则调用 function2(parameter1)
或
如果为真则调用函数 3(参数 1)
如果 false 则调用 function4(parameter1, parameter2)
所有函数都不是 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)
我正在使用 unity2019.2.0b 和 c# 语言。
当我创建对象并通过脚本更改对象的属性时,例如缩放旋转位置或速度
在我的例子中,使用 if-else 语句工作正常,但我想使用三元运算符,因为每个属性设置每 1 行脚本以提高可读性。
所以我的问题是如何将 if else 语句转换为没有 return 值函数的三元运算符
我想要的概念是检查 movable 是否为真
如果为真则调用 function1(parameter1)
如果 false 则调用 function2(parameter1)
或
如果为真则调用函数 3(参数 1)
如果 false 则调用 function4(parameter1, parameter2)
所有函数都不是 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)