我有一个不会返回空对象的方法。我想让它更明确,这样我的API用户就不必编写像下面这样的代码:
if(Getxyz() != null)
{
// do stuff
}
我该如何展示这个意图?
我有一个不会返回空对象的方法。我想让它更明确,这样我的API用户就不必编写像下面这样的代码:
if(Getxyz() != null)
{
// do stuff
}
我该如何展示这个意图?
Contract.Ensures(Contract.Result<string>() != null)
string! foo
但是Spec#只能用于目标.NET2,并且已被Code Contracts库取代。
Result
应该是一个方法调用:Contract.Result<string>()
。 - porgesContract.Ensures(Contract.Result<T>() != null)
,位于System.Diagnostics.Contracts命名空间的Code Contracts - postconditions中。 - ToolmakerSteve除非您正在使用基于System.ValueType的类型,否则我认为您会没有运气。最好在函数的XML/metadata注释中明确记录这一点。
我不知道在API中是否有最佳实践,因为作为使用者,我仍然会进行防御性编程并检查null。在这种情况下,我认为这仍然是最佳实践,因为我倾向于不相信其他代码总是做正确的事情。
确保 C# 对象从不返回 null 的唯一类型检查的方法是使用结构体。结构体可以具有包含空值的成员,但它们本身永远不能为 null。
所有其他 C# 对象都可以为空。
示例代码:
public struct StructExample
{
public string Val;
}
public class MyClass
{
private StructExamle example;
public MyClass()
{
example = null; // will give you a 'Cannot convert to null error
}
public StructExample GetXyz()
{
return null; // also gives the same error
}
}
上面的例子无法编译。如果使用结构体是可接受的(它变成了值类型,在堆栈上传递,不能被子类化),那么这可能适合您。
对其进行文档化并提供源代码。
Contract.Ensures(Contract.Result<T>() != null)
,位于System.Diagnostics.Contracts命名空间的Code Contracts - postconditions中。从上面的第一个链接中,我可以获得此链接进行下载。 - ToolmakerSteve