2013-02-08 84 views
0

我有一些代碼,看起來像這樣:返回一個元組與空項目

public Tuple<bool, SomeObjectModel> CheckIfJsonIsValid(string IncomingJson) 
{ 
    SomeObjectModel TheObjectModel = new SomeObjectModel(); 
    JavascriptSerializer TheSerializer = new JavascriptSerializer(); 
    ..... 

    try 
    { 
     TheObjectModel = TheSerializer.Deserialize<SomeObjectModel>(IncomingJson); 
    } 
    catch 
    { 
     return new Tuple<bool, SomeObjectModel>(false, null); //question here 
    } 

    ..... 
    return new Tuple<bool, SomeObjectModel>(true, TheObjectModel); 
} 

調用方法首先檢查返回元組的項目1,如果它是假的,結束它的進程。

更好的做法a)返回Tuple中的空值或b)返回SomeObjectModel的新的和新的實例嗎?是否有任何性能影響?

感謝您的建議。

+0

除非構造函數做了很多工作,否則「沒有實際的性能影響」。讓性能測試進行談話;現在,哪種方法更能代表你的模型?而且,如果「返回一個空模型對象」,是否需要一個Tuple? – 2013-02-08 08:00:55

回答

2

讓我提出三種可供選擇的解決方案:


ParseJsonIfValid:如果反序列化的作品,TheObjectModel總是非空。因此,不需要布爾值:

public SomeObjectModel ParseJsonIfValid(string IncomingJson) 
{ 
    JavascriptSerializer TheSerializer = new JavascriptSerializer(); 
    ..... 

    try 
    { 
     return TheSerializer.Deserialize<SomeObjectModel>(IncomingJson); 
    } 
    catch 
    { 
     return null; 
    } 
} 

在調用函數中,只需檢查返回值是否爲空。


ParseJson:如果JSON是通常有效和無效JSON是什麼了可怕的錯誤的標誌,只是拋出一個異常:

public SomeObjectModel ParseJson(string IncomingJson) 
{ 
    JavascriptSerializer TheSerializer = new JavascriptSerializer(); 
    ..... 

    try 
    { 
     return TheSerializer.Deserialize<SomeObjectModel>(IncomingJson); 
    } 
    catch (Exception e) 
    { 
     throw new TheServerSentRubbishException(e); 
    } 
} 

一定要包括在內(「真實」)異常,以便調用函數可以記錄出於調試目的的錯誤的真正原因。


TryParseJson:如果null可以是有效反序列化,你可以使用下面的模式,該模式具有可與.NET框架的TryParse方法相一致的優點是:

public bool TryParseJson(string IncomingJson, out SomeObjectModel theObjectModel) 
{ 
    JavascriptSerializer TheSerializer = new JavascriptSerializer(); 
    ..... 

    try 
    { 
     theObjectModel = TheSerializer.Deserialize<SomeObjectModel>(IncomingJson); 
     return true; 
    } 
    catch (Exception e) 
    { 
     return false; 
    } 
} 
+0

好的,謝謝你的建議! – frenchie