尽管匈牙利命名法是时下认为是不好的做法,它仍然是很常见的编码中的名称类型的用户界面元素,无论是使用前缀(lblTitle,txtFirstName,...)或后缀(TitleLabel,FirstNameTextBox,...).
在我的公司,我们也这样做,因为它使得同事(或很久以前自己)编写的代码更容易阅读(根据我的经验).这个参数通常提出反对这样做 - 如果类型改变,你必须改变变量的名称 - 不是很强,因为改变UI元素的类型通常需要重写代码的所有部分,无论如何它被引用.
所以,我正在考虑在开始WPF开发时保持这种做法(嗯......我们应该使用txtTextBlocks或TextBoxes 的前缀吗?).我错过了什么大的劣势?这是你说"不要这样做,因为......"的机会.
编辑:我知道通过数据绑定,名称UI元素的需求减少.然而,有时需要它,例如在开发自定义控件时......
我知道在库方法中添加一个可选参数是一个重大改变,
void Foo(int x) // OLD
void Foo(int x, int y = 5) // NEW
Run Code Online (Sandbox Code Playgroud)
因为在编译的代码中新版本被视为Foo(int, int).每次调用Foo(0)(源Foo(0, 5)代码)都由编译器转换为(编译代码).因此,使用编译调用的旧客户端Foo(0)将找不到合适的方法.
另一个方向呢?
void Foo(int x, int y = 5) { ... } // OLD
void Foo(int x) { Foo(x, 5); } // NEW
void Foo(int x, int y) { ... } // NEW
Run Code Online (Sandbox Code Playgroud)
Foo(0)(源代码)仍然会编译,并且Foo(0, 5)(编译代码)仍然会找到合适的重载,因此,理论上,这应该可行.
它是否在实践中有效,即.NET运行时和C#/ VB编译器"正式支持"这种情况?或者调用带有可选参数的方法以某种方式"标记",导致它们在可选参数被重载替换时失败?
编辑:为了澄清,我问的二进制兼容性:是否有可能取代library.dll (old)有library.dll (new)没有重新编译projectUsingLibrary.exe?
我有一些使用SqlConnection创建临时表(例如#Foo)的C#代码,调用存储过程来填充那些临时表并将结果返回给C#客户端,使用c#对这些结果执行复杂计算,并使用计算结果更新之前创建的临时表之一.
由于整个过程中使用的临时表,我们必须只有一个SqlConnection.
我发现了使用计算结果更新临时表时的性能瓶颈.此代码已经对更新进行批处理,以防止C#客户端内存不足.每批计算数据通过SqlCommand.ExecuteNonQuery发送到存储过程,然后sproc会更新临时表.代码将大部分时间花在对ExecuteNonQuery的调用上.
因此,我将其更改为BeginExecuteNonQuery,以及在线程上等待并调用EndExecuteNonQuery的代码.这提高了性能约三分之一,但我担心使用相同的SqlConnection对SqlCommand.BeginExecuteNonQuery进行多次并发调用.
这样可以,还是会遇到线程问题?
很抱歉很长的解释.
MSDN文档声明:
BeginExecuteNonQuery方法立即返回,但在代码执行相应的EndExecuteNonQuery方法调用之前,它不能执行任何其他对同一SqlCommand对象启动同步或异步执行的调用.
这似乎意味着不同的SqlCommand对象可以在第一个SqlCommand完成之前调用BeginExecuteNonQuery.
以下是一些说明问题的代码:
private class SqlCommandData
{
public SqlCommand Command { get; set; }
public IAsyncResult AsyncResult { get; set; }
}
public static void TestMultipleConcurrentBeginExecuteNonQueryCalls(string baseConnectionString)
{
var connectionStringBuilder = new SqlConnectionStringBuilder(baseConnectionString)
{
MultipleActiveResultSets = true,
AsynchronousProcessing = true
};
using (var connection = new SqlConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
// ELIDED - code that uses connection to do various Sql work
SqlDataReader dataReader = null;
// in real code, this would be initialized …Run Code Online (Sandbox Code Playgroud) 命令窗口和立即窗口似乎做了非常相似的事情(例如,我可以通过键入在两个窗口中显示变量? myVariable).有什么区别,为什么Visual Studio包含两者?
我需要能够在标签上滚动文本我正在使用这个用于tic tac toe游戏的信用部分.我怎样才能实现这一点我们只被教导滚动滚动条中的数字值而不是文本.
private void xGameCreditsButton_Click(object sender, EventArgs e)
{
this.xWinnerLabel.BackColor = Color.White;
this.xCreditsScrollBar.Visible = true;
this.xWinnerLabel.Text = "This game was made possible with the help of: blah bla blah";
}
Run Code Online (Sandbox Code Playgroud) 我有一个WPF表单,基本上看起来像这样:
<Window ...>
<Grid>
<DockPanel>
[content shown during normal operation]
</DockPanel>
<Grid Background="#CCCC" Visibility="Hidden">
[overlay grid which is only shown during special circumstances]
</Grid>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
覆盖网格隐藏其他所有内容(即"正常内容"),仅在特殊情况下显示(即网络连接断开).运行程序时,这非常正常.
现在,在设计模式下,问题是Visual Studio忽略了Visibility="Hidden".通常,这是完全合理的(毕竟,我希望能够编辑隐藏的UI元素),但在我的情况下,它很烦人,因为它阻止我编辑设计器中DockPanel中的东西.
所以,我想做的是这样的:
<Grid Background="#CCCC" Visibility="Hidden" VS.ShowInDesigner="False">
[overlay grid which is only shown during special circumstances]
</Grid>
Run Code Online (Sandbox Code Playgroud)
但是,唉,没有这样的财产,或者至少没有我所知道的财产.有任何想法吗?
假设我有一个带有返回命令的属性的窗口(实际上,它是一个带有ViewModel类中的Command的UserControl,但让我们尽可能简单地重现问题).
以下作品:
<Window x:Class="Window1" ... x:Name="myWindow">
<Menu>
<MenuItem Command="{Binding MyCommand, ElementName=myWindow}" Header="Test" />
</Menu>
</Window>
Run Code Online (Sandbox Code Playgroud)
但以下不起作用.
<Window x:Class="Window1" ... x:Name="myWindow">
<Grid>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding MyCommand, ElementName=myWindow}" Header="Test" />
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是
System.Windows.Data错误:4:无法找到引用'ElementName = myWindow'的绑定源.BindingExpression:路径= mycommand的; 的DataItem = NULL; target元素是'MenuItem'(Name =''); target属性是'Command'(类型'ICommand')
为什么?我该如何解决这个问题?使用DataContext不是一个选项,因为这个问题发生在可视化树的下方,其中DataContext已经包含正在显示的实际数据.我已经尝试过使用{RelativeSource FindAncestor, ...},但是会产生类似的错误消息.
安装Visual Studio Professional 2015(使用RTM可执行文件但在安装过程中选择Update 2)后,我收到以下警告:
一切似乎都运行正常,我在网上找到的所有资源都是指早期版本的Visual Studio安装程序引发的错误.然而,这些只是警告.
我是否需要做任何事情或者我可以安全地忽略它们吗?
免责声明:众所周知,这catch (ex) { throw ex; } 是不好的做法.这个问题与此无关.
在挖掘Microsoft参考资源的同时,我在很多方法中都注意到了以下模式:
try {
...
} catch {
throw;
}
Run Code Online (Sandbox Code Playgroud)
没有记录,没有调试代码 - 只是一个简单的简单catch { throw; }.
显然,微软的人员应该相当熟练使用C#,这样做的重点是什么,而不是仅仅省略catch块(和try语句)?这样的编码有技术原因,还是纯粹的风格选择?
注意:我不知道它是否相关,但我能找到的所有这些实例也包含一个try-finally嵌套在块try子句中的try-catch块.
我有一个在调试模式下运行的WPF应用程序,我想在应用程序仍在运行时更改XAML.
我不是要求编辑并继续.我不介意我必须重新启动应用程序才能使更改生效.我只是希望能够在应用程序仍在运行时对XAML文件进行更改,而不是必须(1)记住我想在UI中更改的内容,(2)关闭应用程序,(3)回想一下我的内容想改变并做出改变.
c# ×6
wpf ×4
vb.net ×2
.net ×1
ado.net ×1
coding-style ×1
data-binding ×1
installation ×1
mvvm ×1
sql-server ×1
winforms ×1
xaml ×1