传入一个对象作为一个输出参数
我有一个方法来检查对我的程序(某些算法)的对象的有效性。该对象被创建从在通过一个字符串(解析)传入一个对象作为一个输出参数
的逻辑是:
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)。
此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
}
正如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
参数时,通常是因为该方法试图做太多事情。
你的观点似乎很清楚,但出于好奇,你不是一个“TryParse”类人吗? – 2013-05-03 18:43:19
另一种选择是调用构造函数并捕获它抛出的异常。 – nic 2013-05-03 18:44:41
@nic:然后你必须问这个异常是否真的*异常*。如果没有意义,那么不要让调用者处理异常;总是给调用者一种避免异常的方法。 – 2013-05-03 19:12:21
_bool_ isValid? – 2013-05-03 18:25:17
好的catch =)编辑。 – Alexey 2013-05-03 18:26:11
请注意,这不是一个合适的名称。 'isValid'提出了一种测试/检查方法,但它也创造了一些东西。改为将其称为TryParse。 – 2013-05-03 18:38:34