我正在尝试编写一个帮助器方法,该方法将记录消息并使用相同的消息抛出指定类型的异常.我有以下内容:
private void LogAndThrow<TException>(string message, params object[] args) where TException : Exception, new()
{
message = string.Format(message, args);
Logger.Error(message);
throw new TException(message);
}
Run Code Online (Sandbox Code Playgroud)
在添加new()约束之前,编译器抱怨说没有它我无法实例化TException.现在我收到的错误消息是"在创建类型参数'TException'的实例时无法提供参数".我尝试使用无参数构造函数创建实例,然后设置Message属性,但它是只读的.
这是语言的限制还是我不知道的解决方案?也许我可以使用反射,但这对于这么简单的任务来说太过分了.(而且非常丑陋,但这是个人观点的问题.)
我有一个像这样的节点的树视图:"Foo(1234)",并希望允许用户重命名节点,但只允许Foo部分,没有(1234).我首先尝试更改节点文本,BeforeLabelEdit如下所示:
private void treeView1_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e)
{
e.Node.Text = "Foo";
}
Run Code Online (Sandbox Code Playgroud)
但是当我单击节点进行编辑时,文本框中会出现"Foo(1234)".
好的,那就让我们试试别的吧.
我设置treeView1.LabelEdit为false,然后执行以下操作:
private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (treeView1.SelectedNode == treeView1.GetNodeAt(e.Location))
{
treeView1.SelectedNode.Text = "Foo";
treeView1.LabelEdit = true;
treeView1.SelectedNode.BeginEdit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后AfterLabelEdit,我LabelEdit回到了假.
你猜怎么着?这也不起作用.它将节点文本更改为"Foo",但不显示编辑文本框.
有任何想法吗?谢谢
我正在读一本关于C#(Pro C#和Andrew Troelsen的.NET 4平台)的书,我刚读过这段话:
如果要构建将部署到低内存设备(例如支持.NET的手机或PDA)并且需要尽可能节省内存的.NET应用程序,则更改枚举的基础类型会很有帮助.
字节使用更少的内存是真的吗?出于性能原因,它们不是存储在4个字节上吗?我记得在某个地方读过后者,但我找不到任何关于它的信息,甚至在C#规范中都没有.
假设我们有这些局部变量:
int a = 0;
int b = 1;
int c = 2;
int d = 3;
Run Code Online (Sandbox Code Playgroud)
据我所知,这些将在系统堆栈上分配,如下所示:
| |
| 3 | d
| 2 | c
| 1 | b
|_0_| a
Run Code Online (Sandbox Code Playgroud)
这是否意味着为了获得a的值,必须首先从堆栈中弹出d,c和b的值?如果是这样,这些值会在哪里出现?这是否意味着访问最近声明的变量会更快?或者我错过了什么(我怀疑是这种情况),整个事情以其他方式起作用?
编辑:谢谢,伙计们!
我正在使用项目填充ListView并从ImageList(在设计器中)添加图像.但是,即使我将ImageList中的图像尺寸设置为原始尺寸(16x16),图像也会以非常差的质量显示.看一看:
可怕的图像质量http://balazsbotond.hu/downloads/listview-icons.png
原始图像是美丽,锐利的PNG图标.我能做什么?