传入一个对象作为一个输出参数

问题描述:

我有一个方法来检查对我的程序(某些算法)的对象的有效性。该对象被创建从在通过一个字符串(解析)传入一个对象作为一个输出参数

的逻辑是:

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

此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

你只需要声明一个对象。以下代码将适用于您。

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

正如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