绕过标记语句
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。
我目前正在我的代码中实现一个 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。