2013-05-03 63 views
5

我有一個方法來檢查對我的程序(某些算法)的對象的有效性。該對象被創建從在通過一個字符串(解析)傳入一個對象作爲一個輸出參數

的邏輯是:

bool isValid(String str, out Object obj) 
    { 
     obj = null; 
     obj = new Object(str); //Validation happens during the object creating 
     if(obj.Legit) //Don't mind this line :) 
      return true; 
     return false; 
    } 

我把這種驗證從另一個類,其中,如果該驗證失敗,做了不同的驗證(同樣的方法)

void FindingObjectType(String str) 
{ 
     if(isValid(str, out ??????) 
      //process 
} 

所以,而不是?????,我不知道如何傳遞的對象。

我只有1個構造函數Object(String)。

+1

_bool_ isValid? – 2013-05-03 18:25:17

+1

好的catch =)編輯。 – Alexey 2013-05-03 18:26:11

+0

請注意,這不是一個合適的名稱。 'isValid'提出了一種測試/檢查方法,但它也創造了一些東西。改爲將其稱爲TryParse。 – 2013-05-03 18:38:34

回答

8

此MSDN文檔介紹了 「走出去」 的關鍵字:
http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

之前調用isValid()方法,你需要聲明輸出對象:

void FindingObjectType(String str) 
{ 
    Object obj; 
    if(isValid(str, out obj) 
     //process 
} 
+1

有沒有辦法在參數中聲明它?或者是唯一的方法? – Alexey 2013-05-03 18:33:19

+1

我不相信有辦法做到這一點。 C#是一種在分配前需要聲明的語言。 – nic 2013-05-03 18:38:30

3

你只需要聲明一個對象。以下代碼將適用於您。

void FindingObjectType(String str) 
{ 
     Object obj; 
     if(isValid(str, out obj) 
      //process 
} 
+0

該代碼將工作,但不會創建_instance_。它只聲明一個引用變量。 – 2013-05-03 18:34:04

+0

@HenkHolterman實例在IsValid方法內部創建。 – Alexey 2013-05-03 18:35:08

+0

雖然實例是在isValid方法內創建的,但是使用文本來清除混淆。 – Vinay 2013-05-03 18:36:34

7

正如NIC說,通常你會說:

void FindingObjectType(String str) 
{ 
    object obj; 
    if(isValid(str, out obj) 
    { 
     // process valid obj 
    } 
} 

這是完全可以接受的。不過,也有其他的方法可以做到這一點,可能更好的是:

Thing GetThing(String str) 
{ 
    Thing thing = new Thing(str); 
    if(thing.Legit) 
     return thing; 
    return null; 
} 

void FindingObjectType(String str) 
{ 
    Thing thing = GetThing(); 
    if(thing != null) 
     //process 
} 

下面是另一個:

Thing GetThing(String str) 
{ 
    // Make a static method that tests the string. 
    if (Thing.IsLegit(str)) 
     return new Thing(str); 
    return null; 
} 

void FindingObjectType(String str) 
{ 
    Thing thing = GetThing(); 
    if(thing != null) 
     //process 
} 

當然,如果你打算這樣做,那麼你爲什麼需要GetThing?只要說:

void FindingObjectType(String str) 
{ 
    if (Thing.IsLegit(str)) 
    { 
     Thing thing = new Thing(str); 
     //process 
    } 
} 

這最後的模式可能是最好的。你想分開你的顧慮。當你有一個out參數時,通常是因爲該方法試圖做太多事情

+0

你的觀點似乎很清楚,但出於好奇,你不是一個「TryParse」類人嗎? – 2013-05-03 18:43:19

+0

另一種選擇是調用構造函數並捕獲它拋出的異常。 – nic 2013-05-03 18:44:41

+1

@nic:然後你必須問這個異常是否真的*異常*。如果沒有意義,那麼不要讓調用者處理異常;總是給調用者一種避免異常的方法。 – 2013-05-03 19:12:21

相關問題