Проверка параметра конструктора базового класса C#

после запуска анализа кода в VS2010 beta (FxCop для предыдущих версий) я получаю следующее предупреждение:

в доступный для внешнего кода метод - Личность.Идентичность (WindowsIdentity)', проверить параметр 'windowsIdentity' перед его использованием.

конструктор-это:

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

для класса определяется как:

public class Identity : WindowsIdentity

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

5 ответов


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

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

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

    return ident.Token;
}

(Я не стал искать тип WindowsIdentity.Токен, но вы получаете идею)


Я считаю, что 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 если аргумент равен null.


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

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

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

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


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

public Identity(WindowsIdentity winIdentity)
    : base(winIdentity?.Token ?? throw new ArgumentNullException(nameof(winIdentity)))
{
    init();
}

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

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

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

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