我定义了一个类和一个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;
}
}
}
为什么引用类型需要输出关键字?
答案 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的?