使用这样的嵌套Try..Catch块是不是很糟糕?

Nat*_*ate 2 .net c# try-catch

这是一个坏主意吗?有没有更好的方法来达到同样的效果?

// assume that "name" is a string passed as a parameter to this code block
try
{
    MainsDataContext dx = new MainsDataContext();
    try
    {
        Main m = dx.Main.Single(s => s.Name == name);
        return m.ID;
    }
    catch (InvalidOperationException)
    {
        Guid g = Guid.NewGuid();

        Main s = new Main 
        {
            Name = name,
            ID = g
        };

        dx.Mains.InsertOnSubmit(s);
        dx.SubmitChanges();

        return g;
    }
}
catch (Exception ex)
{
    // handle this
}
Run Code Online (Sandbox Code Playgroud)

这里的目标是获取记录的ID(如果存在),否则创建该记录并返回其ID.

Sta*_* R. 6

您应该使用SingleOrDefault,如果记录不存在,它将返回该类的默认值为null.

MainsDataContext dx = null;    
try
    {
         dx = new MainsDataContext();

        Main m = dx.Main.SingleOrDefault(s => s.Name == name);

        if ( m == null)
        { 
           Guid g = Guid.NewGuid();

           m = new Main 
          {
              Name = name,
              ID = g
          };

         dx.Mains.InsertOnSubmit(m);
         dx.SubmitChanges();

        }

        return m.ID;
    }
    catch (Exception ex)
    {
        // handle this
    }
    finally
    {
       if(dx != null)
          dx.Dispose();
    }
Run Code Online (Sandbox Code Playgroud)

在使用DataContext时使用using关键字是个好主意

using ( MainsDataContext dx = new MainsDataContext())
{
        Main m = dx.Main.SingleOrDefault(s => s.Name == name);

        if ( m == null)
        { 
           Guid g = Guid.NewGuid();

           m = new Main 
          {
              Name = name,
              ID = g
          };

         dx.Mains.InsertOnSubmit(m);
         dx.SubmitChanges();

        }

        return m.ID;
}
Run Code Online (Sandbox Code Playgroud)


Tam*_*ege 6

Main m = dx.Main.SingleOrDefault(s => s.Name == name);

if (m == default(Main))
{
    // it does not exist
}
else
{
    // it does exist
}
Run Code Online (Sandbox Code Playgroud)

从问题中可以看出,类型Main是类还是结构(编辑:我只是意识到实际上它必须是一个类),因此我使用default()而不仅仅是比较null.