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

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

Во внешне видимом методе 'Идентификационные данные. Идентификационные данные (WindowsIdentity)', проверяют параметр 'windowsIdentity' перед использованием его.

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

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

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

public class Identity : WindowsIdentity

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

9
задан Steve 17 December 2009 в 19:09
поделиться

4 ответа

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

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, но вы поняли идею)

12
ответ дан 4 December 2019 в 13:02
поделиться

Я полагаю, что 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 было бы добавление статической частной функции к вашему классу, которая может проверять параметр 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 было бы добавление статической частной функции к вашему классу, которая может проверять параметр 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 , если аргумент равен нулю.

2
ответ дан 4 December 2019 в 13:02
поделиться

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

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

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

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

1
ответ дан 4 December 2019 в 13:02
поделиться

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

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

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

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

0
ответ дан 4 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: