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