绕过带标签的语句

时间:2018-10-10 04:02:48

标签: c# goto

我当前正在代码中实现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;
    }

2 个答案:

答案 0 :(得分:4)

goto在这里是不必要的。

首先,代码逐行执行,因此首先执行if语句,然后转到下一行,这就是您的InsertAdd“节”。 但是此标签不会阻止下面的代码执行。因此,您需要以不同的方式构造代码(我将在下面说明)。

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

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

但是,即使InsertAdd失败,if也会被执行。为了防止这种情况,您可以将所有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";

这样,如果代码进入InsertAdd()部分,将不会执行else内部的代码:)

通常不建议使用goto。参见this article

答案 1 :(得分:3)

GOTO语句仅在您有需求时使用,例如发生特定情况时,我们直接跳转到标签,然后代码从该区域开始运行,但是如果不发生此情况,则代码将逐条语句运行。< / p>

了解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";

}

希望有帮助