2013-12-18 35 views
0

我定義了一個類和一個TryParse方法。當我寫的TryParse像下面的結果永遠是零和的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; 
     } 
    } 
} 

爲什麼參考類型需要輸出關鍵字?

+1

你的第二個例子不能編譯:'使用未分配出去parameter' –

+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; 
} 

使用它以這種方式:或者使用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的不同實例),但你只能修改引用的副本而不是原來的副本。

因此,這將使使cnull在調用方法:

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 
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 
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?

+0

修改我的代碼,以正確的代碼。 – mohammad

+0

顯示您的調用語句。 – york

相關問題