Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IF-ELSE/TRY-CATCH和First()与Single()的优先级排序_C#_.net_If Statement_Try Catch - Fatal编程技术网

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
vs
If/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)?