小编ste*_*enj的帖子

为什么要删除不必要的C#using指令?

例如,我很少需要:

using System.Text;
Run Code Online (Sandbox Code Playgroud)

但它默认始终存在.我假设如果您的代码包含不必要的using指令,应用程序将使用更多内存.但还有什么我应该知道的吗?

另外,如果只在一个文件和大多数/所有文件中使用相同的using指令,它会有什么不同吗?


编辑:请注意,这个问题与被称为using语句的无关概念无关,旨在通过确保当对象超出范围时调用其IDisposable.Dispose方法来帮助管理资源.请参阅C#中"使用"的使用.

c# assemblies using

212
推荐指数
4
解决办法
4万
查看次数

枚举上最常见的C#按位操作

对于我的生活,我不记得如何设置,删除,切换或测试位域中的位.要么我不确定,要么混淆它们,因为我很少需要这些.因此,"比特作弊表"会很好.

例如:

flags = flags | FlagsEnum.Bit4;  // Set bit 4.
Run Code Online (Sandbox Code Playgroud)

要么

if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?
Run Code Online (Sandbox Code Playgroud)

您能举例说明所有其他常见操作,最好是使用[Flags]枚举的C#语法吗?

.net c# enums flags bit-manipulation

197
推荐指数
9
解决办法
16万
查看次数

Windows窗体:使用BackgroundImage会减慢窗体控件的绘制速度

我有一个Windows窗体(C#.NET 3.5),上面有许多按钮和其他控件,都分配给一个跨越整个窗体的最顶层面板.例如,层次结构为:Form - > Panel - >其他控件.

一旦我将BackgroundImage分配给Panel,控件就会非常缓慢地绘制.如果我使用Form的BackgroundImage属性并将Panel的BackgroundColor设置为"transparent",我会有同样的效果.看起来好像首先绘制了具有背景的窗口,然后在绘制下一个控件之前稍微延迟逐个添加每个控件.换句话说,您实际上可以按照每个控件绘制到窗体的顺序.一旦所有控件都被绘制,一旦此效果不再发生,但表单的响应速度仍然很慢.

在Visual Studio的设计器中,我得到了相同的效果,尤其是在移动控件时.有时表单的绘图完全停止一两秒,这使得在设计器和生成的应用程序中使用BackgroundImage是一个完全的拖拽.

当然,我尝试使用DoubleBuffered = true,我也使用反射在所有控件上设置它,没有任何效果.

此外,这里是加载代码的表单,因为它有点不寻常.它将所有控件从另一个表单复制到当前表单上.这样做是为了能够在共享公共表单和公共代码的基础上使用设计器分别编辑每个屏幕的视觉外观.我预感它可能是减速的原因,但它仍然无法解释为什么减速器已经在设计师中引人注目.

private void LoadControls(Form form)
{
    this.SuspendLayout();

    this.DoubleBuffered = true;
    EnableDoubleBuffering(this.Controls);

    this.BackgroundImage = form.BackgroundImage;
    this.BackColor = form.BackColor;

    this.Controls.Clear();
    foreach (Control c in form.Controls)
    {
        this.Controls.Add(c);
    }

    this.ResumeLayout();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,SuspendLayout()ResumeLayout()用于避免不必要的重绘.

尽管如此,一旦使用BackgroundImage,表单就像"地狱一样慢".我甚至尝试将其转换为PNG,JPG和BMP,看看是否有任何区别.此外,图像尺寸为1024x768,但较小的图像具有相同的减速效果(尽管略小).

我该怎么办?

.net c# performance winforms

27
推荐指数
2
解决办法
3万
查看次数

如何将Windows窗体.NET应用程序显示为托盘图标?

要使.NET应用程序在Window的系统托盘中显示为图标,需要做些什么?

你如何处理所述图标上的鼠标按钮点击?

.net vb.net system-tray systray winforms

19
推荐指数
2
解决办法
2万
查看次数

Pro/con:在条件语句中初始化变量

在C++中,您可以在if语句中初始化变量,如下所示:

if (CThing* pThing = GetThing())
{
}
Run Code Online (Sandbox Code Playgroud)

为什么会考虑这种糟糕或好的风格?有什么好处和坏处?

我个人喜欢这种风格,因为它限制了pThing变量的范围,因此当它为NULL时永远不会意外使用它.但是,我不喜欢你不能这样做:

if (CThing* pThing = GetThing() && pThing->IsReallySomeThing())
{
}
Run Code Online (Sandbox Code Playgroud)

如果有办法完成上述工作,请发布.但如果那是不可能的,我仍然想知道为什么.

从这里借来的问题,类似的主题,但PHP.

c++ if-statement coding-style

16
推荐指数
2
解决办法
2万
查看次数

你如何将Lua粘贴到C++代码?

你是使用Luabind,还是使用Lu ++,还是其他一些库(如果是,哪一个)或者根本没有?

对于每种方法,专业人士和骗子是什么?

c++ scripting lua

12
推荐指数
2
解决办法
1万
查看次数

Iterator初始化for循环内部是不好的样式,为什么?

通常你会发现这样的STL代码:

for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}
Run Code Online (Sandbox Code Playgroud)

但我们实际上有建议像这样写:

SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
for (; Iter != IterEnd; ++Iter)
{
}
Run Code Online (Sandbox Code Playgroud)

如果您担心范围,请添加括号:

{
    SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
    SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
    for (; Iter != IterEnd; ++Iter)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该可以提高速度和效率,特别是在编程控制台的情况下,因为在循环的每次迭代中都不会调用.end()函数.我只是把性能提升视为理所当然,这听起来很合理,但我不知道它有多少,它肯定取决于容器的类型和实际使用的STL实现.但是,使用这种风格已经有几个月了,我实际上更喜欢它.

可读性的原因是:for line干净整洁.在实际生产代码预选赛和成员变量这是很容易有长行,如果你在第一个例子中使用的样式.这就是为什么我故意让它在这个例子中有一个水平滚动条,只是让你看到我在说什么.;)

另一方面,您突然将Iter变量引入for循环的外部范围.但是,至少在我工作的环境中,即使在第一个例子中,也可以在外部范围内访问Iter.

你对此有什么看法?除了可能限制Iter的范围之外,还有第一种风格的专业人士吗?

c++ iteration iterator stl coding-style

12
推荐指数
3
解决办法
4295
查看次数