C# IF-ELSE/TRY-CATCH和First()与Single()的优先级排序
所以,我最近和一个程序员同事有点争论。具体来说:我们一直在争论在特定场景中正确使用C# IF-ELSE/TRY-CATCH和First()与Single()的优先级排序,c#,.net,if-statement,try-catch,C#,.net,If Statement,Try Catch,所以,我最近和一个程序员同事有点争论。具体来说:我们一直在争论在特定场景中正确使用Try/Catch和If/Else以及First()/Single() 变异#1他的方法 var items = Search(dto.number); // Returns a List of Objects if (items.Count = 1) { wPerson = items.First(); } else { return; } 变体#2-我把他的代码改成了这个 var items
Try/Catch
和If/Else
以及First()/Single()
变异#1他的方法
var items = Search(dto.number); // Returns a List of Objects
if (items.Count = 1)
{
wPerson = items.First();
}
else
{
return;
}
变体#2-我把他的代码改成了这个
var items = Search(dto.number); // Returns a List of Objects
try
{
wPerson = items.Single();
}
catch
{
// Handle exception
return;
}
我们期望var items=Search(dto.number)的结果代码>始终为1
问题:
哪些变化是必要的?我试图在下面为我的观点辩护。请纠正我
首先是Single()
。我总是尽量具体,我决定遵循以下规则:
- 第一-->接受N
- FirstOrDefault-->接受0和N
- 单个-->接受1
- SingleOrDefault-->接受0和1
First()
其次:Try/Catch
vsIf/Else
。因为我已经将First()
更改为Single()
,所以我认为if
语句是多余的。对我知道Try/Catch
的性能不如If
语句,但我们希望只有一个结果。如果我们得到更多或更少,我认为这是一个错误,对于Try/Catch
,我实际上会这样对待它
我在这里这么不自在吗?如果你能避免的话,就不要尝试/抓住它。“异常流”应使用异常,即:不可预期
不过,我建议您将这两种变体结合起来
var items = Search(dto.number); // Returns a List of Objects
if (items.Count != 1) return;
wPerson = items.Single();
因为如果成功,您只希望得到一个结果,所以可以立即中断
如果出于任何原因,您更改了代码,并且存在x>1项,则此方法将中断,因为您只期望1项(因此为单一项),而不会进入“异常”流(假设第一个对象是正确的对象)
如果你能避免的话,就不要试图抓住它。“异常流”应使用异常,即:不可预期
不过,我建议您将这两种变体结合起来
var items = Search(dto.number); // Returns a List of Objects
if (items.Count != 1) return;
wPerson = items.Single();
因为如果成功,您只希望得到一个结果,所以可以立即中断
如果出于任何原因,您更改了代码,并且存在x>1项,则此方法将中断,因为您只期望1项(因此为单一项),而不会进入“异常”流(假设第一个对象是正确的对象)
嗯,抛出/捕获异常仅适用于异常情况,因此您当前的代码
try {
wPerson = items.Single();
}
catch {
// Something is very wrong (e.g. RDBMS table's ruined, file's corrupted etc)
throw;
}
意味着您在项中只需要一个wPerson
。但是,如果项目中的0
、1
或2
项目
是预期行为
您不应该使用Single
,而是可以说,Take
var items = Search(dto.number); // Returns a List of Objects
var wPersons = items.Take(2).ToArray();
if (wPersons.Length <= 0) {
// No person found; probably, wPerson = some_default_value
...
}
else if (wPersons.Length == 1) {
// Exactly one person found
wPerson = wPersons[0];
...
}
else {
// Two or more persons found; we have to resolve tie somehow
...
}
var items=Search(dto.number);//返回对象列表
var wPersons=items.Take(2.ToArray();
如果(wPersons.Length那么,抛出/捕获异常仅适用于异常情况,因此您当前的代码
try {
wPerson = items.Single();
}
catch {
// Something is very wrong (e.g. RDBMS table's ruined, file's corrupted etc)
throw;
}
表示您在项目中只需要一个wPerson
。但是,如果项目中的0
、1
或2
项目
是预期行为
您不应该使用Single
,而是可以说,Take
var items = Search(dto.number); // Returns a List of Objects
var wPersons = items.Take(2).ToArray();
if (wPersons.Length <= 0) {
// No person found; probably, wPerson = some_default_value
...
}
else if (wPersons.Length == 1) {
// Exactly one person found
wPerson = wPersons[0];
...
}
else {
// Two or more persons found; we have to resolve tie somehow
...
}
var items=Search(dto.number);//返回对象列表
var wPersons=items.Take(2.ToArray();
如果(wPersons.Length Exception仅适用于例外情况;如果你把Single
放进去,你只需要一个项目;如果你得到了2
或者什么都没有,这意味着有些东西出了问题。但是,如果你很可能有0
,1
或者2
项目,你应该使用FirstOrDefault
wPerson
/vwPerson
的类型是什么?它是一个类还是一个结构?它是如何声明的?它是在这个代码之前分配的吗?当你有所有的方法避免异常时,为什么你要支付异常的费用?首先,带有泛型try catch
的单个肯定很差。不要使用这种方法。例如,如果Search
返回IQueryable
,就会引起问题,因为在这一点上,单个
可能会由于数据库连接问题引发异常。如果Search
预计只提供一个条目的列表,那么为什么它会返回一个列表而不是一个条目空值(或空值)“例外”仅适用于例外情况;如果你放了,比如说,Single
你只需要一个项目;如果你得到了,比如说,2
或者什么都没有,这意味着某件事出了很大的问题。但是,如果你很可能有0
,1
或者2
项目,你应该使用FirstOrDefault
>wPerson
/vwPerson
的类型是什么?它是一个类还是一个结构?它是如何声明的?它是在这个代码之前分配的吗?当你有各种方法来避免异常时,为什么你要支付异常的费用?首先,带有泛型try catch
的单个肯定很差。不要使用那种方法。例如,如果Search
返回IQueryable
,则会导致问题,因为此时单个
可能会由于数据库连接问题而引发异常。如果Search
预计只提供一个条目的列表,那么为什么它会返回一个列表而不是单个实体(或null)?