.netcode-contracts

.NET Guard Class Library?


I'm looking for a library or source code that provides guard methods such as checking for null arguments. Obviously this is rather simple to build, but I'm wondering if there are any out there for .NET already. A basic Google search didn't reveal much.


Solution

  • There is CuttingEdge.Conditions. Usage example from the page:

    public ICollection GetData(Nullable<int> id, string xml, ICollection col)
    {
        // Check all preconditions:
        id.Requires("id")
            .IsNotNull()          // throws ArgumentNullException on failure
            .IsInRange(1, 999)    // ArgumentOutOfRangeException on failure
            .IsNotEqualTo(128);   // throws ArgumentException on failure
    
        xml.Requires("xml")
            .StartsWith("<data>") // throws ArgumentException on failure
            .EndsWith("</data>"); // throws ArgumentException on failure
    
        col.Requires("col")
            .IsNotNull()          // throws ArgumentNullException on failure
            .IsEmpty();           // throws ArgumentException on failure
    
        // Do some work
    
        // Example: Call a method that should not return null
        object result = BuildResults(xml, col);
    
        // Check all postconditions:
        result.Ensures("result")
            .IsOfType(typeof(ICollection)); // throws PostconditionException on failure
    
        return (ICollection)result;
    }
    

    Another nice approach, which isn't packaged in a library, but could easily be, on Paint.Net blog:

    public static void Copy<T>(T[] dst, long dstOffset, T[] src, long srcOffset, long length)
    {
        Validate.Begin()
                .IsNotNull(dst, "dst")
                .IsNotNull(src, "src")
                .Check()
                .IsPositive(length)
                .IsIndexInRange(dst, dstOffset, "dstOffset")
                .IsIndexInRange(dst, dstOffset + length, "dstOffset + length")
                .IsIndexInRange(src, srcOffset, "srcOffset")
                .IsIndexInRange(src, srcOffset + length, "srcOffset + length")
                .Check();
    
        for (int di = dstOffset; di < dstOffset + length; ++di)
            dst[di] = src[di - dstOffset + srcOffset];
    }
    

    I use it in my project and you could borrow the code from there.