将对象作为out参数传递

时间:2013-05-03 18:22:40

标签: c# reference

我有一个方法可以检查对象与我的程序(某些算法)的有效性。该对象是从传入的字符串创建(解析)的。

逻辑是:

 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
}

所以不是?????,我不知道如何传递对象。

我只有一个构造函数,Object(String)。

3 个答案:

答案 0 :(得分:8)

此MSDN文档描述了“out”关键字:
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 :(得分:7)

正如尼克所说,通常你会说:

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参数时,通常是因为该方法试图做太多事情

答案 2 :(得分:3)

您只需要声明一个对象。以下代码适合您。

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