我有一个带有以下签名的方法:
public Guid FindTermIDFromCustomProperty()
{
// Logic here to find an item and return the guid
}
我的问题是,如果在函数中找不到任何项目,那么将不会返回GUID - 这不言而喻!但有没有办法返回一些平淡的GUID?
更好的是,我可以采用更通用的方法,不仅仅是针对GUID,而且通常在我返回强类型时?我真的不想将对象用作返回类型,必须有更好的方法。
提前致谢。
答案 0 :(得分:6)
要回答你的第一个问题,你可以使用Guid.Empty,它会返回一个保证全为零的guid。
至于你的第二个问题,一种方法是返回一个bool并使用out参数作为参数,bool指示你是否有值。不是每个人都喜欢使用out参数。
public bool FindTermIDFromCustomProperty(out Guid termId)
答案 1 :(得分:6)
你可以返回一个可以为空的Guid,所以如果没有找到任何项目,你将返回null
public System.Nullable<Guid> FindTermIDFromCustomProperty()
{
// Logic here to find an item and return the guid
if (!found)
{
return null;
}
}
Nullable types为结构工作。
引用类型已经可以设置为null。
答案 2 :(得分:5)
如果您使用的是.NET 2.0或更高版本,则可以返回可以为空的类型。
public Guid? FindTermIDFromCustomProperty()
{
// Logic here to find an item and return the guid
else
return null;
}
var guid = FindTermIDFromCustomProperty();
if (guid.HasValue) // or "if (guid != null)"
DoSomethingWith(guid.Value);
答案 3 :(得分:3)
所以你有两个选择回归
选项1:
对于值类型:int
,datetime
等,您可以返回默认值(0, DateTime.minValue, Guid.Empty
),或使用可以返回nullable, Guid?, int?
的{{1}}等。 。虽然可以为空的是可耻的,但人们往往会因为某种原因而回避它,所以使用它有时取决于你工作的团队。我知道那些不使用它们的团队。他们认为他们的尴尬和害羞,在这种情况下突然添加它们使它在其余的代码中突出,因为它不遵循应用程序其余部分的伪标准。就个人而言,我喜欢无用的,但不是每个人都有同样的感觉。
对于参考类型,您只需返回null
为集合返回null:关于处理集合的另一个争论是你应该返回什么。如果集合中没有任何内容,您可以返回null,或者您可以返回空列表等。您可以拆分它们意味着不同的东西,但是再一次,您应该遵循程序的其余部分。你需要记住的是,很多人忘记了像null
语句这样的集合变量调用foreach
,如果集合对象是GetEnumerator()
,那将抛出异常。
选项2: 当你找不到你正在寻找的对象时,你会抛出一个异常,说明你找不到你想要的东西。
关于使用哪一方存在激烈的争论,一方面返回默认值不会直接警告调用方法没有找到某些东西,它必须知道返回值实际上不是id (有时这不如你想象的那么明显)。另一方面,抛出异常意味着调用方法必须知道可能会引发异常。真的取决于你的情况决定哪个是正确答案。
答案 4 :(得分:1)
您可以返回Guid.Empty
。或抛出异常(内置的一个或自定义的ItemNotFoundException
)。或者在return中使用Nullable类型声明您的方法并返回null:
public Nullable<Guid> FindTermIDFromCustomProperty()
{
// Logic here to find an item and return the guid
}
答案 5 :(得分:1)
尝试使用可空类型。对于值类型,您可以通过添加?,例如
使它们可为空INT? x = null;
if(x!= null) {
}