我当前正在代码中实现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;
}
答案 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";
}
希望有帮助