Не объявляйте видимые поля экземпляра, предупреждающие в последовательной структуре - PullRequest
0 голосов
/ 28 января 2019

Я использую некоторые DllImports в приложении wpf для захвата экрана.Я звоню GetWindowRect в user32.dll.Для этого требуется структура rect, переданная ему.Расположение структуры имеет значение, так как это собственный вызов.

Я пробую VS 2019 Предварительный просмотр 2, который дает мне предупреждения, которых я раньше не видел.Все поля в rect генерируют одно и то же предупреждение:

CA1051 Do not declare visible instance fields

В остальной части кода я исправил это, превратив поле в свойство, добавив {get; set;} к этому.Я не знаю, смогу ли я безопасно сделать это в структуре, где макет имеет значение.

Rect также дает мне предупреждение, что я должен переопределить Equals.

CA1815 Rect should override Equals.

CA1815 Rect should override the equality (==) and inequality (!=) operators.

Я никогда не сравниваю это, хотя и определенноне нужно, я просто хочу исправить предупреждение.

public static class NativeMethods
{
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    public static IntPtr _GetForegroundWindow()
    {
        return GetForegroundWindow();
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern IntPtr GetDesktopWindow();

    public static IntPtr _GetDesktopWindow()
    {
        return GetDesktopWindow();
    }

    //Am unable to get code analysis to shut up about this.
    [DllImport("user32.dll")]
    private static extern int GetWindowRect(IntPtr hWnd, ref Rect rect);

    public static IntPtr _GetWindowRect(IntPtr hWnd, ref Rect rect)
    {
        return (IntPtr)GetWindowRect(hWnd, ref rect);
    }        
}

[StructLayout(LayoutKind.Sequential)]
public struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}    

Как я могу исправить эти предупреждения?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Документация CA1051: Не объявлять видимые поля экземпляра говорит:

Причина

Внешне видимый тип имеетвнешне видимое поле экземпляра.

Ключевой точкой для типа и поля является external .Следовательно, исправление (поскольку предполагается, что оно используется только внутри вашего приложения) - сделать struct (и класс, который его предоставляет) internal:

[StructLayout(LayoutKind.Sequential)]
internal struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}    

internal static class NativeMethods
{
    // ...
}

Обратите внимание, что предупреждение CA1051не генерируется компилятором C #, но Code Analysis, следовательно, может быть исключен или проигнорирован из набора правил CA (хотя документация предлагает не подавлять его ).

0 голосов
/ 28 января 2019

Вы можете подавить предупреждения в файле следующим образом:

#pragma warning disable CA1051, CA1815

или отключить его в файле csproj для всего проекта

<NoWarn>CA1051, CA1815</NoWarn>

РЕДАКТИРОВАТЬ Если выЕсли вы хотите исправить предупреждение, а не подавить его, вы должны следовать предупреждающему сообщению.

Я никогда не сравниваю его, хотя и определенно не нужно, я просто хочу исправить предупреждение.

Предупреждение появится, если вы не добавите операторы, подобные предложенным в сообщении.Предупреждение означает, что «это, вероятно, работает для вас сейчас, но не лучшая практика».Переопределение одинаковых операторов для структур улучшает удобочитаемость и производительность, также структуры должны быть неизменными, открытые поля нарушают неизменность и скрывают потенциальные ошибки.

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