编程语言
首页 > 编程语言> > c# – 不要在顺序结构中声明可见的实例字段警告

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

作者:互联网

我在wpf应用程序中使用了一些DllImports来捕获屏幕.我正在user32.dll中调用GetWindowRect.它需要传递给它的rect结构.结构的布局很重要,因为它是本机调用.

我正在尝试VS 2019预览2,它给了我以前没见过的警告. rect中的所有字段都会生成相同的警告:

CA1051不声明可见的实例字段

在其余的代码中,我通过将{get; set;}附加到它来将字段转换为属性来修复此问题.我不知道我是否可以在布局很重要的结构中安全地执行此操作.

Rect也给了我一个警告,我应该重写Equals.

CA1815 Rect应该重写Equals.

CA1815 Rect应覆盖等于(==)和不等(!=)运算符.

我从来没有比较它,但绝对不需要,我只想修复警告.

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;
}    

我该如何解决这些警告?

解决方法:

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

Cause

An externally visible type has an externally visible instance field.

类型和字段的关键点是外部的.因此修复(因为它应该只在你的应用程序中使用)是使struct(和暴露它的类)内部:

[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).

标签:c,pinvoke,winapi,compiler-warnings
来源: https://codeday.me/bug/20190701/1345675.html