不要在顺序结构中声明可见实例字段警告

时间:2019-01-28 09:36:26

标签: c# winapi pinvoke compiler-warnings

我在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 :(得分:1)

您可以在这样的文件中禁止显示警告:

#pragma warning disable CA1051, CA1815

或在整个项目的csproj文件中将其禁用

<NoWarn>CA1051, CA1815</NoWarn>

编辑,如果您想纠正警告而不是取消警告,则应遵循警告消息。

  

我从来没有比较过它,而且绝对不需要,我只是想修正警告。

在警告将出现除非添加像由信息提示操作员。该警告表示“它现在可能对您有用,但不是最佳实践”。重写等于运营商对于结构改善了可读性和性能,也结构应该是不可变的,公共字段打破不变性和隐藏潜在的错误。

答案 1 :(得分:1)

CA1051: Do not declare visible instance fields的文档中说:

  

原因

     

外部可见类型具有外部可见实例字段。

类型和字段的关键点是外部。因此,解决方法(因为应该只在您的应用程序内部使用)是使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#编译器生成的,而是代码分析,因此可以从CA规则集中排除或忽略(尽管文档建议使用not suppress it)。