我运行了一个代码分析并收到了这条消息:
警告5 CA1822:Microsoft.Performance:从不使用'MainForm.CheckFileIfFileIsInUse(String)'中的'this'参数(或Visual Basic中的'Me').将成员标记为静态(或在Visual Basic中为Shared)或在方法体中使用"this"/"Me"或至少使用一个属性访问器(如果适用).d:\工作\更新\更新\ MainForm.vb
我不确定我理解它.这是它所指的行:
Dim testfile As String = thefilename & ".tst"
Run Code Online (Sandbox Code Playgroud)
它说从未使用它,但在下一行我有这个:
If IO.File.Exists(testfile) Then
IO.File.Delete(testfile)
End If
Run Code Online (Sandbox Code Playgroud)
所以我知道它正在被使用.我在两个地方都有同样的信息我不明白为什么它说它从未使用过.
帮助一个困惑的新手找到他的方式:P
谢谢你,像往常一样
我正在将SVN与Google Code Project Hosting一起用于学校项目.随着代码库大小的增加,我经常发现自己想知道如下问题:
有没有可用的插件?(如果没有,我会有兴趣自己开发一个.关于从哪里开始的任何想法?)
我们将Visual Studio 2008与AnkhSVN插件一起使用.
我运行代码分析并收到此消息:
CA1822:Microsoft.Performance:从不使用'CreateIntervalString(TimeSpan)'中的'this'参数(或Visual Basic中的'Me').将成员标记为静态(或在Visual Basic中为Shared)或在方法体中使用"this"/"Me"或至少使用一个属性访问器(如果适用).
我的代码是:
private string CreateIntervalString(TimeSpan timeSpan)
{
return timeSpan.ToString();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,因为CreateIntervalString函数不使用类的任何成员,并且只使用timeSpan输入,VisualStudio建议我将其标记为静态.
我的问题:
非常感谢!
例子:
以下方法提供错误:
private string CreateIntervalString(TimeSpan timeSpan)
{
return timeSpan.ToString();
}
Run Code Online (Sandbox Code Playgroud)
以下不是:
private DateTime ParseDateString(string dateTimeString)
{
// the years,monthe,days,hours,minutes and secondes found by the dateTimeString input
return new DateTime(years, months, days, hours, minutes, secondes);
}
Run Code Online (Sandbox Code Playgroud) 我正在分析一些代码,我正在寻找字符串文字,以检查我是否有任何重复.例如,如果我有
def test_foo
input_filename = "foo.txt"
# ...
end
def test_bar
input_filename = "bar.txt" # Fine
# ...
end
def test_baz
# Bad! Refactor it to a constant that's shared by test_foo and test_baz
input_filename = "foo.txt"
# ...
end
Run Code Online (Sandbox Code Playgroud)
我希望分析程序告诉["foo.txt", "bar.txt", "foo.txt"]我源代码中存在的内容.
我怎样才能做到这一点?
我有几个静态方法将Form转换为Control(如下所示).分析器标记两者,说明"CA2000:Microsoft.Reliability:In method'...',object'form'不是沿着所有异常路径放置的.在所有对它的引用之前调用System.IDisposable.Dispose on object'form'超出了范围." 类似的标记为tabPage.
注意:对于那些没有Enterprise Edition和Analyzer菜单的用户,这看起来很像FxCop输出.
我不清楚我应该做什么.如果new失败,将抛出异常.我有机会打电话到哪里Dispose?
class Foo
{
static public Form FormAsControl()
{
Form form = new Foo();
form.TopLevel = false;
form.FormBorderStyle = FormBorderStyle.None;
form.Dock = DockStyle.Fill;
form.Visible = true;
return form;
}
static public TabPage FormAsTabPage()
{
Form form = Foo.FormAsControl();
TabPage tabPage = new TabPage();
tabPage.Text = form.Text;
tabPage.Controls.Add(form);
return tabPage;
}
...
}
Run Code Online (Sandbox Code Playgroud) 根据今天的讲座,第一个循环具有顺序的运行时O(n),而第二个循环具有顺序的运行时O(log(n)).
for (int i = 0; i < n; i++) { // O(n)
stuff(); // O(1)
}
for (int i = 1; i < n; i*=4) { // O(log(n))
stuff(); // O(1)
}
Run Code Online (Sandbox Code Playgroud)
有人可以详细说明原因吗?
我想强制某个结构永远不会直接访问它的字段,总是使用结构函数.
例:
struct NoOutsideAccess { int field1;}
struct example {NoOutsideAccess f1;}
NoOutsideAccess noa;
example * ex;
&noa // OK
&ex->noa // OK
noa.field1; // ERROR
ex->f1.field1 // ERROR
Run Code Online (Sandbox Code Playgroud)
我看过C解析器和分析工具,但我不确定我能用它们做到这一点.
我不想更改结构,因为它的字段将直接在其他模块中使用.在这种情况下,我想要一些脚本来指出它的使用位置,以便不应该改变它的模块.
但我确实发现了一个副本,不确定是否会匹配每个用法,但会给它一个镜头.
示例代码:
void COptionsDlg::OnBnClickedButtonMoreSettings()
{
CString strCaption = _T("");
const auto pMoreSettingsButton = GetDlgItem(IDC_BUTTON_MORE_SETTINGS);
if (pMoreSettingsButton == nullptr)
return;
pMoreSettingsButton->GetWindowText(strCaption);
__pragma(warning(suppress:26414))
auto pDlgOther = std::make_unique<COtherSettingsSheet>(strCaption);
if (pDlgOther != nullptr)
{
pDlgOther->DoModal();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器仍然抱怨这一行:
它仍然说:
C26462: by 指向的值
pMoreSettingsButton仅分配一次,将其标记为指向const(con.4)的指针。
我正在使用 Visual Studio 2022 Preview 6,并且我在其他类文件中注意到了这一点。这是我做错了什么还是我应该向 Microsoft 解决的错误?
这是我在进行 Visual Studio 2019 代码分析后得到的代码(警告 C26409 避免显式调用 new 和 delete,请使用 std::make_unique (r.11)。):
#include <windows.h>
#include <strsafe.h>
int main()
{
auto *sResult = new WCHAR[256];
StringCchPrintfW(sResult, 256, L"this is a %s", L"test");
delete[] sResult;
}
Run Code Online (Sandbox Code Playgroud)
我原本假设使用 new/delete 而不是 calloc/free,但现在编译器告诉我使用 std::make_unique。我找不到任何有关如何更改代码以使其兼容的示例。
所以我的问题是:
如何更改我的代码,使其不使用 new/delete
为什么我不应该使用 new/delte 与 std::make_unique ?
我在我正在维护的实用程序上运行代码分析,它建议我更改它:
private static extern int ReadMenu1File(string Menu1Path);
Run Code Online (Sandbox Code Playgroud)
......对此:
private static extern int ReadMenu1File(UnmanagedType.LPWStr Menu1Path);
Run Code Online (Sandbox Code Playgroud)
...使用此措辞:"为P/Invoke字符串参数指定封送处理为了降低安全风险,将参数'Menu1Path'编组为Unicode,将DllImport.CharSet设置为CharSet.Unicode,或者将参数显式封送为UnmanagedType.LPWStr.如果需要将此字符串封装为ANSI或依赖于系统,请明确指定MarshalAs,并设置BestFitMapping = false;为了增加安全性,还要设置ThrowOnUnmappableChar = true."
...但是当我这样做时,它说:" 类型名称'LPWStr'在类型'System.Runtime.InteropServices.UnmanagedType'中不存在 "和''System.Runtime.InteropServices.UnmanagedType.LPWStr'是'字段'但用作'类型' "
代码完成没有帮助(键入"UnmanagedType."后没有建议.)也没有上下文菜单选项来添加缺失使用.