发送类的引用抛出一个方法

时间:2013-12-18 09:00:58

标签: c#

我定义了一个类和一个TryParse方法。当我在下面写TryParse时,结果总是为null,而TryParse结果有MyProperty = 0:

class MyClass 
{
    public int MyProperty { get; set; }

    public static MyClass Parse(string s)
    {
        MyClass outC=new MyClass();
        outC.MyProperty=int.Parse(s);
        return outC;
    }

    public static bool TryParse(string s,MyClass result)
    {
        try
        {
            result = Parse(s);
            return true;
        }
        catch
        {
            return false;
        }
    } 
 }

但如果我写这样的方法,结果是真的。

class MyClass
 {
    public int MyProperty { get; set; }

    public static MyClass Parse(string s)
    {
        MyClass outC=new MyClass();
        outC.MyProperty=int.Parse(s);
        return outC;
    }

    public static bool TryParse(string s,out MyClass result)
    {
        try
        {
            result = Parse(s);
            return true;
        }
        catch
        {
            result = null;
            return false;
        }
    }
}

为什么引用类型需要输出关键字?

3 个答案:

答案 0 :(得分:1)

不要将try-catch用于正常的工作流程:

public static bool TryParse(string s, MyClass result)
{
    if(result == null)
        throw new ArgumentNullException("result");
    int prop;
    bool success = int.TryParse(s, out prop);
    if(success)
        result.Prop = prop;
    return success;
}

如果您希望该方法初始化并返回MyClass的实例,请使用out

public static bool TryParse(string s, out MyClass result)
{
    result = new MyClass();
    int prop;
    bool success = int.TryParse(s, out prop);
    if(success)
        result.Prop = prop;
    return success;
}

以这种方式使用它:

MyClass c;
bool b = TryParse("10", out c);
// c is initialized

或使用ref关键字通过引用传递:

public static bool TryParse(string s, ref MyClass result)
{
    if(result == null)
        throw new ArgumentNullException("result");
    int prop;
    bool success = int.TryParse(s, out prop);
    if (success)
        result.Prop = prop;
    return success;
}

以这种方式使用它:

MyClass c = new MyClass(); // must be initialized
bool b = TryParse("10", ref c);

如果使用ref传递参数,则可以修改原始实例,因此甚至可以分配null。如果你没有ref,你也可以指定null(或MyClass的不同实例),但你只会修改引用的副本而不是原始副本。

因此,这会在调用方法中生成c null

public static void MakeNull(ref MyClass result)
{
    result = null;
}

MyClass c = new MyClass();
MakeNull(ref c);
Console.Write(c == null); // true

虽然这不会修改它:

public static void MakeNull(MyClass result)
{
    result = null;
}

MyClass c = new MyClass();
MakeNull(c);
Console.Write(c == null); // false

答案 1 :(得分:0)

out is a keyword当在方法参数中使用时,意味着您必须在返回之前为变量赋值。

因此,在您的方法中,您必须指定result

result = new MyClass();

返回之前。在调用方法之前,不必设置该参数。你应该返回bool

方法返回值为bool,您作为out发送的参数将具有在方法中指定的值。

实施例

MyClass result;
bool success = TryParse("abc", out result);
// result here will have what the method assigned

答案 2 :(得分:0)

您的代码在我的计算机上正常运行。

    class MyClass2
    {
        public int Prop { get; set; }

        public static bool TryParse(string s, MyClass2 result)
        {
            try
            {
                result.Prop = int.Parse(s);
                return true;
            }
            catch
            {
                return false;
            }
        }
    }


    private static void TestMethod(string str)
    {
        var obj = new MyClass2();
        var rst = MyClass2.TryParse(str, obj);
        Console.WriteLine("bool:{0},int:{1}",rst,obj.Prop);
    }

    [Fact]
    private void TestCase()
    {
        TestMethod("445");
        TestMethod("abc");
    }
    //out put       
bool:True,int:445       
bool:False,int:0

你是对的,对于参考参数,不需要out关键字。 你是如何使用TryParse mehtod的?