现在我正在制作一个简单的程序,这是我多次思考过的问题。很多次我运行我的方法两次是因为在运行它们之前检查返回值,我想知道是否有一种方法可以防止这种情况,比如使用我正在检查的方法返回的值。这很难解释,所以这是我程序中的一个真实例子。
public class SFDBRepository
{
public static Domain.SF.SFObject GetSFOrder(string WorkOrd)
{
//As you can see here i'm checking on the output of this method, before trying to return it.
if (Domain.SF.SF.GetOrder(WorkOrd) != null)
{
//If the value is not null (My method returns null if no result), return the object
return Domain.SF.SF.GetOrder(WorkOrd);
}
//Same thing happens here. My method runs twice every time almost.
else if(Domain.Building_DeliveryPerformance.Building_DeliveryPerformance.GetObject(WorkOrd) != null)
{
return Domain.Building_DeliveryPerformance.Building_DeliveryPerformance.GetObject(WorkOrd);
}
else
{
return null;
}
}
}
答案 0 :(得分:6)
您可以将其简化为以下代码,这些代码只调用一次这些方法并使代码更具可读性:
Dim thisDict As New Dictionary(Of String, String)
Public Sub listviewupdate(ByVal D As Dictionary(Of String, String))
ListView1.Items.Clear()
For Each KVP As KeyValuePair(Of String, String) In D
Dim LVI As New ListViewItem(KVP.Key)
LVI.SubItems.Add(KVP.Value)
ListView1.Items.Add(LVI)
Next
End Sub
Private Sub rbChoiceA_Checked(ByVal sender As Object, ByVal e As EventArgs)
Dim rbA As RadioButton = TryCast(sender, RadioButton)
Dim str As String = rbA.Parent.Name.Remove(0, 6)
lblItemNo.Text = str
If thisDict.ContainsKey(str) Then thisDict.Remove(str)
thisDict.Add(str, rbA.Text)
listviewupdate(thisDict)
End Sub
解释为什么这有效 - ??运算符(null-coalescing运算符!)基本上表示"如果返回的值在??的左侧?为null,然后返回右侧的表达式的值"。
这样您只需要调用一次函数。
答案 1 :(得分:0)
public static Domain.ShopFloor.ShopFloorObject GetShopFloorOrder(string WorkOrd)
{
//As you can see here i'm checking on the output of this method, before trying to return it.
Domain.ShopFloor.ShopFloorObject wo = Domain.ShopFloor.Shopfloor.GetOrder(WorkOrd);
if (wo != null)
{
//If the value is not null (My method returns null if no result), return the object
return wo;
}
//Same thing happens here. My method runs twice every time almost.
Domain.ShopFloor.ShopFloorObject yowo = Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject(WorkOrd);
if(yowo != null)
{
return yowo;
}
/* default return */
return null;
}
PS
你有点做“工厂模式”
见
答案 2 :(得分:-1)
在我看来你可能正在使用一个临时变量来保存结果,你可以测试并返回。
public class ShopFloorDBRepository
{
public static Domain.ShopFloor.ShopFloorObject GetShopFloorOrder(string WorkOrd)
{
var result = Domain.ShopFloor.GetOrder(WorkOrd);
if (result != null) return result;
...
这是一种常见的范例,特别是当被调用的方法很昂贵和/或有副作用时,你不希望发生两次。
这里," var"声明设置"结果"的类型到被调用方法返回的类型;你也可以使用实际类型的名称。
如果您希望进行两种不同类型的测试,除非它们具有相同的类型(在这种情况下看起来像是这样),否则您需要两个不同的变量。
另一种需要完整类型的机制,您也会看到:
public static ShopFloorObject GetShopFloorOrder(string WorkOrd)
{
ShopFloorObject result;
if ( (result = Domain.ShopFloor.GetOrder(WorkOrd)) != null )
return result;
if ( (result = Domain.DG9_DeliveryPerformance.DG9_DeliveryPerformance.GetObject(WorkOrd)) != null)
return result;
return null;
在这里,你明确地声明了返回值的类型,然后进行了你已经指示的两个调用,测试结果为null,并返回第一个非空值。