我在另一个问题中看到了这个提示,并想知道是否有人可以向我解释这是如何工作的?
try { return x; } finally { x = null; }
Run Code Online (Sandbox Code Playgroud)
我的意思是,该finally
条款真正执行后的return
声明?这段代码的线程不安全吗?你能想到这个try-finally
黑客可以做的任何额外的hackery 吗?
虽然这个问题乍一看可能听起来很愚蠢,但请听我说.
c#的get {}和set {}方法在你不知道编译目标在构建代码时如何发展的情况下是非常有用的.我很享受他们的自由很多次,现在我想知道是否有类似的方法,但有点不同的光.
当我在gamedev中工作时,日常扩展/更新/改进现有代码是一种非常常见的做法.因此,我自学的一种模式是在我的大部分方法中不要多次使用"返回"语句.
我这样做的原因是总是能够在方法的底部写一些东西,并确保一旦我的方法结束,我写的行总是100%被调用.
这是一个例子:
public void Update()
{
UpdateMovement();
if (IsIncapacitated)
return;
if (IsInventoryOpened)
{
UpdateInventory();
return;
}
if (Input.HasAction(Actions.Fire))
{
Fire();
return;
}
else if (Input.HasAction(Actions.Move))
{
Move(Input.Axis);
return;
}
}
Run Code Online (Sandbox Code Playgroud)
现在想象一下,在整个项目的许多地方都会调用这种方法几十次.然后第二天你决定需要在Update()方法的最后调用UpdatePhysics()方法.在这种情况下,只有4个回报,实际上可能会更糟.
然后想象一下,这种情况每天都会发生几次.你可能会说不好的计划?我可能同意你的意见,但我确实认为发展自由在现代编码中至关重要.在你开始编写代码之前,我认为你不应该试图预测你的项目可能会采取的每一个转变.
确保像上面描述的问题永远不会发生的一种方法是重写方法如下:
public void Update()
{
UpdateMovement();
if (!IsIncapacitated)
{
if (IsInventoryOpened)
{
UpdateInventory();
}
else
{
if (Input.HasAction(Actions.Fire))
{
Fire();
}
else if (Input.HasAction(Actions.Move))
{
Move(Input.Axis);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你总是可以在底部添加一行,并确保它总是被称为nomatter是什么.
所以我想询问是否有另一种方法可以允许在任何地方放置"返回"-s,同时仍然可以随时在方法的底部轻松添加额外的代码.也许c#中有任何形式的语法可以帮到你吗?或者也许有更好的编码实践可以消除这样的问题?
更新:当我开始收到答案时,我意识到我需要澄清一些事情.
'try/catch/finally'是一种矫枉过正 - 我永远不会使用它们.它们对catch()有严重的性能损失,它们搞砸了Visual Studio中的"编辑并继续"功能,它们看起来很丑陋.
理想我需要能够从我决定在方法结尾添加的任何代码中访问Update()方法中的局部变量,
当我写这个问题时,我已经有了一个答案 - 嵌套.我的第二个代码示例没有返回,因此我可以在方法的最底部添加代码,它将在100%的时间内工作,而我将能够使用局部变量.嵌套很糟糕,这就是为什么我在这里寻找更好的解决方案.
更新2: …