使用Assert作为前提条件是否可以?

Til*_*lak 5 .net c# null assert illegalargumentexception

我正在阅读与处理空值有关的这篇文章.

其中一个建议(根据SO帖子)是在空值无效时使用Assert.

我(到目前为止)在测试项目中广泛使用了null.在普通代码(测试项目除外)中使用Asserts语句对我来说很奇怪.

为什么 - >因为我从未使用过这种方式,所以也不要在任何书中读过它.

问题
1.使用Asserts作为前提条件是否可行
2. 断言的优点/缺点检查参数并抛出Argument___Exception

如果重要,我要求.NET(不适用于java)

Ste*_*tty 7

您可能希望查看代码合同.它们提供方法的静态和运行时检查,您也可以将它们应用于接口,以便合同成为公共API的一部分.

例如,从我自己的一些代码中复制(此代码在接口上实现契约):

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一个更简单但更全面的例子:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)