我知道.NET中有optional parameter,但如果参数为null,有没有办法强制.NET抛出异常?
这样我就不必对我的方法进行参数null检查,这会使代码混乱。
或者是否有其他方法可以在我的方法签名上强制执行非null参数?,或许使用属性?
答案 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) 在视图中你可以写这样的