所以,我知道try/catch会增加一些开销,因此不是控制流程流的好方法,但是这种开销来自何处以及它的实际影响是什么?
空try值具有某些价值,如其他地方所述
try{}
finally
{
..some code here
}
Run Code Online (Sandbox Code Playgroud)
但是,最后有什么用为空:
try
{
...some code here
}
finally
{}
Run Code Online (Sandbox Code Playgroud)
编辑:注意我还没有实际检查以查看CLR是否为空生成任何代码 finally{}
我决定删除代码中的一些using语句,这样我就可以捕获特定的异常并手动处理资源.我已经重构了一些代码,使其更具可读性和maintable,执行新的try/catch块,如果他们已经被正确地放置在手头的任务,我在想后.
例:
public static DataTable Select(string table, string[] column, Object operand)
{
DataTable dTable = null;
SQLiteConnection connection = null;
SQLiteCommand command = null;
SQLiteDataReader dReader = null;
//convert to array for arguments
StringBuilder query = new StringBuilder();
query.Append("select ");
for (int i = 0; i < column.Length; i++)
{
query.Append(column[i]);
if (i < column.Length - 1)
{
query.Append(",");
}
}
query.Append(" from ");
query.Append(table);
try
{
connection = new SQLiteConnection(_connectionString);
command = new SQLiteCommand(query.ToString(), connection);
dTable = …Run Code Online (Sandbox Code Playgroud) 虽然这个问题乍一看可能听起来很愚蠢,但请听我说.
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: …