相关疑难解决方法(0)

检查空参数的最佳方法(Guard子句)

例如,您通常不希望构造函数中的参数为null,因此看到类似的东西是很正常的

if (someArg == null)
{
    throw new ArgumentNullException(nameof(someArg));
}

if (otherArg == null)
{
    throw new ArgumentNullException(nameof(otherArg));
}
Run Code Online (Sandbox Code Playgroud)

它会使代码混乱.

有没有办法比这更好地检查一个参数列表的参数?

像"检查所有参数并抛出ArgumentNullException,如果它们中的任何一个为null并且为您提供null的参数"之类的东西.

顺便说一下,关于重复的问题声明,这不是关于用属性或内置的东西标记参数,而是有些人称之为Guard Clauses来保证对象接收初始化的依赖关系.

c# constructor arguments

20
推荐指数
8
解决办法
2万
查看次数

扩展空检查的最佳方法是什么?

你们都这样做了:

public void Proc(object parameter)
{
    if (parameter == null)
        throw new ArgumentNullException("parameter");

    // Main code.
}
Run Code Online (Sandbox Code Playgroud)

Jon Skeet曾经提到他有时会使用扩展来进行检查,所以你可以这样做:

parameter.ThrowIfNull("parameter");
Run Code Online (Sandbox Code Playgroud)

所以我得到了这个扩展的两个实现,我不知道哪个是最好的.

第一:

internal static void ThrowIfNull<T>(this T o, string paramName) where T : class
{
    if (o == null)
        throw new ArgumentNullException(paramName);
}
Run Code Online (Sandbox Code Playgroud)

第二:

internal static void ThrowIfNull(this object o, string paramName)
{
    if (o == null)
        throw new ArgumentNullException(paramName);
}
Run Code Online (Sandbox Code Playgroud)

你怎么看?

c# null extension-methods isnull

16
推荐指数
3
解决办法
4702
查看次数

ArgumentNullException - 如何简化?

我注意到这个代码在我的构造函数中出现了很多:

if (someParam == null) throw new ArgumentNullException("someParam");
if (someOtherParam == null) throw new ArgumentNullException("someOtherParam");
...
Run Code Online (Sandbox Code Playgroud)

我有一些构造函数,其中注入了几个东西,并且必须都是非null.谁能想到一种简化这种方法的方法?我唯一能想到的是以下几点:

public static class ExceptionHelpers
{
   public static void CheckAndThrowArgNullEx(IEnumerable<KeyValuePair<string, object>> parameters)
   {
      foreach(var parameter in parameters)
         if(parameter.Value == null) throw new ArgumentNullException(parameter.Key);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,使用它会是这样的:

ExceptionHelper.CheckAndThrowArgNullEx(new [] {
    new KeyValuePair<string, object>("someParam", someParam),
    new KeyValuePair<string, object>("someOtherParam", someOtherParam),
    ... });
Run Code Online (Sandbox Code Playgroud)

...这并没有真正帮助简化代码.Tuple.Create()而不是KVP不起作用,因为Tuple的GTP不协变(即使IEnumerable的GTP是).有任何想法吗?

c# exception

16
推荐指数
6
解决办法
1万
查看次数

C#代码契约 - 避免检查空引用的参数

我今天读到了C#4.0代码合同.似乎验证方法的参数不是null的常见做法如下:

Contract.Requires(p != null);
Run Code Online (Sandbox Code Playgroud)

然而,对于我来说,我必须为我的代码中的每个接口方法的每个参数执行此操作,这似乎是不合理的.在绝大多数情况下,参数预计不为空.我希望有某种机制允许定义一些特定的参数被"允许"为空(类似于Java中的"@Nullable"注释),并且Contracts框架将自动确保其余的不是空值.

除了节省很多时间在这个"样板检查"(以及许多"合同类",除了非空参数之外,根本没有任何条件需要验证),它还会使合同代码更清洁而且更"以逻辑为导向".

我的问题是,有没有办法做到这一点,如果没有,哪里没有,或者可能为什么我的方法在这里错了?

c# code-contracts c#-4.0

8
推荐指数
1
解决办法
591
查看次数

C#和可空标志/注释?

C#有Nullable注释吗?

例如在Java中

public @Nullable <T extends BaseJsonClass> T getModel(String saveKey, Class<T> type) {
Run Code Online (Sandbox Code Playgroud)

现在当开发人员试图打电话时

Object.getModel().someMethod()
Run Code Online (Sandbox Code Playgroud)

编译器会警告他们没有检查null.

我知道?C#中var名称末尾的标记,someObject?但问题是当在许多地方使用vars时,它可能是棘手/烦人/ JSON模型.

c# nullable

3
推荐指数
2
解决办法
2838
查看次数

字段有义务的义务

可能重复:
在C#/ .NET中将参数标记为不可为空?

例如,我有一个带有一个字段的简单类:

class User
{
    private readonly string _name;

    public User(string name)
    {
        _name = name;
    }

    public string Name { get { return _name; } }
}
Run Code Online (Sandbox Code Playgroud)

如何禁止设置name参数null,因为User应该总是有一些名字?我不能在构造函数中做这样的检查,因为无论如何都会创建实例.我应该使用一些模式(使用私有构造函数和添加方法来生成实例...不知道这个模式是如何调用的)或者是否有任何语言支持来执行此操作?

谢谢.

c# design-patterns

0
推荐指数
1
解决办法
136
查看次数