.NET是否存在“强制参数”这样的问题?

时间:2013-12-03 10:03:48

标签: c# .net

我知道.NET中有optional parameter,但如果参数为null,有没有办法强制.NET抛出异常?

这样我就不必对我的方法进行参数null检查,这会使代码混乱。

或者是否有其他方法可以在我的方法签名上强制执行非null参数?,或许使用属性?

5 个答案:

答案 0 :(得分:2)

您可以使用代码合同。

参考:Microsoft

链接示例:

void IArray.Insert(int index, Object value)
{
    Contract.Requires(index >= 0);
    Contract.Requires(index <= ((IArray)this).Count);  // For inserting immediately after the end.
    Contract.Ensures(((IArray)this).Count == Contract.OldValue(((IArray)this).Count) + 1);
}

答案 1 :(得分:1)

开箱即用,但我使用扩展方法来执行此操作:

public static class GenericExtensions
{
    /// <summary>
    /// Throws an ArgumentNullException if "this" value is default(T)
    /// </summary>
    /// <typeparam name="T">(Inferred) "this" type</typeparam>
    /// <param name="self">"this" value</param>
    /// <param name="variableName">Name of the variable</param>
    /// <returns>"this" value</returns>
    /// <exception cref="System.ArgumentException">Thrown if "this" value is default(T)</exception>
    public static T ThrowIfDefault<T>(this T self, string variableName)
    {
        if (EqualityComparer<T>.Default.Equals(self, default(T)))
            throw new ArgumentException(string.Format("'{0}' cannot be default(T)", variableName));
        return self;
    }   // eo ThrowIfDefault<T>    
}

用法:

public void SomeFunc(string value)
{
    value.ThrowIfDefault("value");
}

public void MyFunc(Guid guid)
{
    guid.ThrowIfDefault("guid");
}

它在类构造函数中也很有用,因为它还返回值:

public class A
{
}

public class B
{
    private readonly A _a;

    public B(A a)
    {
        _a = a.ThrowIfDefault("a");
    }
}

为字符串编写一个字符串也很简单,它不仅确保它不为空,而且还有一个长度,。

答案 2 :(得分:1)

可能解决方案是代码合同组合(在调试时非常有用)和直接参数检查以便抛出异常释放:

void MyMethodWithNotNullValue(Object value) {
  // Contract failure allow you to see the stack, 
  // inspect local variables' values,
  // start debugger etc.
  Contract.Requires(!Object.ReferenceEquals(null, value));

  // Unfortunately, contracts can be switched off (usually in release), 
  // so we have to check "value" manually as well
  if (Object.RefrenceEquals(null, value))
    throw new ArgumentNullException("value", "You can't set null to value because...");

  ...
}

答案 3 :(得分:0)

您还可以查看Aspect oriented programming

这为您提供了一个前后方法执行。

public class LogAspect : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine(Environment.NewLine);

        Console.WriteLine("Entering [ {0} ] ...", args.Method);

        base.OnEntry(args);
    }

    public override void OnExit(MethodExecutionArgs args)
    {
        Console.WriteLine("Leaving [ {0} ] ...", args.Method);

        base.OnExit(args);
    }
}

答案 4 :(得分:0)

.net MVC应用程序当你创建一个特定变量的模型时,你可以像这样使用...........................

** [必需(ErrorMessage =“需要部门”)]

    public string Department { get; set; }**

因此,当用户忘记在那时添加部门时,它将通过例外 在视图中你也必须喜欢..................

@ Html.ValidationMessageFor(m =&gt; m.Department) 在视图中你可以写这样的