Проверка параметра конструктора базового класса C # - PullRequest
8 голосов
/ 17 декабря 2009

После запуска Code Analysis в бета-версии VS2010 (FxCop для предыдущих версий) я получаю следующее предупреждение:

внешне видимым методом 'Identity.Identity (WindowsIdentity)', проверить параметр 'windowsIdentity' перед его использованием.

Конструктор:

public Identity(WindowsIdentity windowsIdentity)
         : base(windowsIdentity.Token)
{
         init();
}

для класса, определенного как:

public class Identity : WindowsIdentity

Мой вопрос: как мне проверить параметр windowsIdentity? Должен ли я проверить его в конструкторе и выдать исключение, или есть лучший способ вызвать это?

Ответы [ 5 ]

12 голосов
/ 17 декабря 2009

Вы можете проверить его статическим методом:

public Identity(WindowsIdentity windowsIdentity)
         : base(GetToken(windowsIdentity))
{
         init();
}

static Token GetToken(WindowsIdentity ident)
{
    if(ident == null)
        throw new ArgumentNullException("ident");

    return ident.Token;
}

(я не стал искать тип WindowsIdentity.Token, но вы поняли)

2 голосов
/ 17 декабря 2009

Я полагаю, что FXCop сообщает об этой ошибке здесь, потому что думает, что вы можете столкнуться с NullReferenceException путем доступа к windowsIdentity при вызове конструктора базового класса.

Один из способов добавить проверку правильности для null - добавить статическую приватную функцию в ваш класс, которая может проверять параметр WindowsIdentity на null и предпринимать соответствующие действия:

private static WindowsIdentity ValidateIdentity( WindowsIdentity identity )
{
    if( identity == null )
        throw new ArgumentNullException( "identity" );
    // possibly some other validation checks here...

    return identity;        
}

public Identity(WindowsIdentity windowsIdentity)
    : base( ValidateIdentity( windowsIdentity ).Token )
{
     init();
}

Другой подход заключается в использовании троичного оператора для проверки параметра, например:

public Identity(WindowsIdentity windowsIdentity)
    : base( windowsIdentity == null ? null : windowsIdentity.Token )
{
     init();
}

Но что вы должны спросить себя: что бы вы сделали? Если вы просто собираетесь сгенерировать исключение, возможно, будет правильным оставить код как есть, поскольку он уже будет проходить через NullReferenceException, если аргумент равен нулю.

1 голос
/ 14 ноября 2017

Начиная с C # 6.0, вы можете использовать нуль-коалесцирующий оператор в сочетании с нуль-условным оператором , например:

public Identity(WindowsIdentity winIdentity)
    : base(winIdentity?.Token ?? throw new ArgumentNullException(nameof(winIdentity)))
{
    init();
}
1 голос
/ 17 декабря 2009

Это жалуется, потому что если вы передадите NULL как windowsIdentity, то, когда конструктор соединится с базовым классом, он выдаст исключение пустой ссылки.

Лучший способ справиться с этим зависит от вашего дизайна. Вы можете проверить это на ноль, как это:

:base(windowsIdentity == null ? null : windowsIdentity.Token)

Или вы могли бы создать другой конструктор в конструкторе базового класса, который принимает WindowsIdentity в качестве параметра, и чтобы этот конструктор выполнял эту часть проверки. По сути, есть множество способов справиться с этим, просто используйте то, что лучше всего работает в вашей ситуации.

0 голосов
/ 17 декабря 2009

FX-полицейский говорит вам, что параметр не может быть нулевым, поэтому, если он вам действительно нужен, вы должны как-то его проверить. Поскольку вы используете его в конструкторе, вы, вероятно, хотите, чтобы значение отличалось от нуля, поэтому вы должны проверить его там, чтобы коп копа прекратил вас раздражать.

Если вам нужен конструктор с нулевым значением, у вас должен быть другой конструктор без параметров.

Если вы не используете его или проверяете его в другой точке, вы можете пропустить предупреждение.

Чтобы избежать проблемы с FXcop, вы должны генерировать ArgumentNullException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...