绕过标记语句

Bypass a labeled statement

我目前正在我的代码中实现一个 goto 语句,但在调试时我注意到即使我没有调用 goto 语句也执行了标记的语句。关于实现 goto 语句,我的代码是否正确?感谢您的帮助。

下面是我的代码结构,即使流程转到 else 语句,也会执行 "InsertAdd" 标记的语句。我是否缺少一些代码或逻辑?谢谢。

我不想在每个 if 语句中重复我的代码,这就是我使用 goto 的原因。如果您还可以建议其他方法,我们也将不胜感激。

if (id == -107) goto InsertAdd;
else if (totalAllTk + qty <= 24) goto InsertAdd;
else statusChk = "FULL";

InsertAdd:
    if (itemExists)
    {
         Cart exists = (from item in db.Carts
         where item.ProductId == id && item.SessionId == sessionId && item.SizeId == id select item).FirstOrDefault();
         newQuantity = exists.Quantity + qty;
         exists.Quantity = newQuantity;
         db.SaveChanges();
    }
    else
    {
        Cart newItem = new Cart()
        {
             ProductId = id,
             CreatedBy = userID,
             SessionId = sessionId,
             Quantity = qty,
             SizeId = id,
             Size = tkType,
             CreatedOn = DateTime.Now.ToUniversalTime()
        };
        db.Carts.Add(newItem);
        db.SaveChanges();
        newQuantity = qty;
    }

GOTO 语句仅在您有要求时使用,例如当特定条件发生时我们直接跳转到标签,然后代码从 运行ning 开始 area.but 如果条件没有发生代码将 运行 逐条声明。

了解 goto 在 C# 中的工作原理goto (C# Reference)

但最好不要太依赖 goto。

如果您想在其他条件下跳过 InsertAdd 语句,请在您的代码中尝试

 if (id == -107) goto InsertAdd;
 else if (totalAllTk + qty <= 24) goto InsertAdd;
 else statusChk = "FULL";
 return; // to make your function exit in else condition
 InsertAdd:
 if (itemExists)
 {
     Cart exists = (from item in db.Carts
     where item.ProductId == id && item.SessionId == sessionId && item.SizeId == id select item).FirstOrDefault();
     newQuantity = exists.Quantity + qty;
     exists.Quantity = newQuantity;
     db.SaveChanges();
 }
 else
 {
    Cart newItem = new Cart()
    {
         ProductId = id,
         CreatedBy = userID,
         SessionId = sessionId,
         Quantity = qty,
         SizeId = id,
         Size = tkType,
         CreatedOn = DateTime.Now.ToUniversalTime()
    };
    db.Carts.Add(newItem);
    db.SaveChanges();
    newQuantity = qty;
 }

你也可以不使用 goto 实现这个

if (id != -107 || totalAllTk + qty > 24) {   // Running your code here
  if (itemExists)
  {
     Cart exists = (from item in db.Carts
     where item.ProductId == id && item.SessionId == sessionId && item.SizeId == id select item).FirstOrDefault();
     newQuantity = exists.Quantity + qty;
     exists.Quantity = newQuantity;
     db.SaveChanges();
  }
  else
  {
    Cart newItem = new Cart()
    {
         ProductId = id,
         CreatedBy = userID,
         SessionId = sessionId,
         Quantity = qty,
         SizeId = id,
         Size = tkType,
         CreatedOn = DateTime.Now.ToUniversalTime()
    };
    db.Carts.Add(newItem);
    db.SaveChanges();
    newQuantity = qty;
  }
}
else {statusChk = "FULL";

}

希望对您有所帮助

goto在这里是不必要的。

首先,代码是逐行执行的,所以先执行if语句,然后转到下一行,也就是你的InsertAdd"section"。 但是这个标签不会阻止下面的代码执行。所以你需要以不同的方式构建你的代码(我将在下面展示如何)。

此外,如果您想采取与 if 中完全相同的操作,为什么还要 else if?您应该将其简化为:

if (id == -107 || totalAllTk + qty <= 24) goto InsertAdd;
else statusChk = "FULL";

但是,即使 if 失败,InsertAdd 仍然会被执行。为了防止它,您可以将所有 InsertAdd 代码放在 if 中(不,您不会有重复的代码)。

更好的解决方案是声明一个方法:

public void InsertAdd(){ // InsertAdd code here }

并像这样使用它:

if (id == -107 || totalAllTk + qty <= 24) InsertAdd();
else statusChk = "FULL";

即使您想坚持最初的 if 声明,使用以下方法也很容易:

if (id == -107) InsertAdd();
else if (totalAllTk + qty <= 24) InsertAdd();
else statusChk = "FULL";

这样,如果代码转到 else 部分,InsertAdd() 中的代码将不会被执行 :)

通常,goto 不鼓励。参见 this article