我正在经历与空值处理有关的post。
推荐之一(根据SO帖子)是在null无效时使用Assert。
到目前为止,我已经在测试项目中广泛使用了null。在普通代码(测试项目除外)中使用Asserts语句对我来说似乎很奇怪。
为什么是->因为我从未用过这种方式,所以也从不会读过任何有关它的书。
问题
1.可以使用Asserts作为前提条件
2.关于检查参数并抛出参数___Exception的主张的利弊
如果重要的话,我要的是.NET(不是Java的)
最佳答案
您可能需要研究Code Contracts。它们提供了方法的静态检查和运行时检查,您也可以将它们应用于接口(interface),以使契约(Contract)成为公共(public)API的一部分。
例如,从我自己的一些代码复制(此代码在接口(interface)上实现契约(Contract)):
using System;
using System.Diagnostics.Contracts;
using Project.Contracts.Model.Accounts;
using Project.Contracts.Services;
/// <summary>
/// Data access for accounts.
/// </summary>
[ContractClass(typeof(AccountRepositoryContract))]
public interface IAccountRepository
{
/// <summary>
/// Gets the user by id.
/// </summary>
/// <param name="userId">The user id.</param>
/// <returns>The user, or <c>null</c> if user not found.</returns>
[Pure]
User GetUserById(int userId);
}
/// <summary>
/// Contract class for <see cref="IAccountRepository"/>.
/// </summary>
[ContractClassFor(typeof(IAccountRepository))]
internal abstract class AccountRepositoryContract : IAccountRepository
{
/// <summary>
/// Gets the user by id.
/// </summary>
/// <param name="userId">The user id.</param>
/// <returns>
/// The user, or <c>null</c> if user not found.
/// </returns>
public User GetUserById(int userId)
{
Contract.Requires<ArgumentException>(userId > 0);
return null;
}
}
一个更简单但更全面的示例:
public class Foo
{
public String GetStuff(IThing thing)
{
// Throws ArgumentNullException if thing == null
Contract.Requires<ArgumentNullException>(thing != null);
// Static checking that this method never returns null
Contract.Ensures(Contract.Result<String>() != null);
return thing.ToString();
}
}
关于c# - 可以将Assert用作前提条件吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13957137/