我在一段代码中发现了一个奇怪的问题,即即使其参数与数据源中的记录匹配,adhoc SQL查询也没有产生预期的输出.我决定将以下测试表达式输入到即时窗口中:
new SqlParameter("Test", 0).Value
Run Code Online (Sandbox Code Playgroud)
这给了null
我一个让我挠头的结果.似乎SqlParameter
构造函数将零视为空值.以下代码生成正确的结果:
SqlParameter testParam = new SqlParameter();
testParam.ParameterName = "Test";
testParam.Value = 0;
// subsequent inspection shows that the Value property is still 0
Run Code Online (Sandbox Code Playgroud)
谁能解释这种行为?这是故意的吗?如果是这样,它可能相当危险......
我开发并维护一个用C#2.0编写的大型(500k + LOC)WinForms应用程序.它是多用户,目前部署在大约15台机器上.系统的开发正在进行中(可以被认为是一个永久的测试版),并且很少有人能够保护用户免受可能在每周构建中引入的潜在新错误的影响.
出于这个原因,我发现自己变得非常依赖于调试器中的编辑和继续.它不仅有助于寻找漏洞和修复漏洞,而且在某些情况下还可以进行持续开发.我发现能够在正在运行的应用程序的上下文中执行新编写的代码非常有价值 - 不需要重新编译并为新代码添加特定的入口点(必须添加虚拟菜单选项,按钮等等)应用程序并记住在下一个生产构建之前删除它们 - 所有内容都可以在不停止进程的情况下实时进行测试和测试.
我坚持编辑并继续这么高的考虑,我积极地编写代码以完全兼容它.例如,我避免:
yield
(实用程序代码除外)现在,我完全清楚C#3和4中的新语言功能在很大程度上与编辑和继续(lambda表达式,LINQ等)不兼容.这是我拒绝将项目迁移到更新版本的框架的原因之一.
我的问题是,避免使用这些更高级的结构来支持非常非常容易调试的代码是否是一种好的做法?这种发展是否合法,还是浪费?另外,重要的是,这些构造中的任何一个(lambda表达式,匿名方法等)是否会产生性能/内存开销,这些代码可以避免编写良好,编辑和继续兼容的代码?...或者C#编译器的内部工作方式是否使这些高级构造比手动编写的"扩展"代码运行得更快?
.NET 2.0添加了EventHandler<TArgs>
通用委托类型,以简化编写自定义事件的过程; 而不是必须定义一个EventArgs
类及其相应的委托(例如MyEventArgs
和MyEventHandler
),您只需要编写args类.
请记住,为什么这个委托类型在.NET Framework中几乎没有出现?我知道大多数核心API是在引入泛型之前开发的,但即使在像WPF这样的框架的新部分中,它们也选择明确定义委托类型; 例如,RoutedEventHandler
而不是EventHandler<RoutedEventArgs>
.
泛型事件处理程序委托是否存在固有的错误?我经常使用它,我担心与内置类相比,我的代码看起来很不合适.
我试图理解用户选择或指定的字体大小(例如,使用FontDialog)与.NET中Font类报告的em-size 之间的差异,这让我绞尽脑汁.
例如:
using (FontDialog dlg = new FontDialog()) {
if (dlg.ShowDialog() == DialogResult.OK) {
Console.WriteLine("Selected font size: " + dlg.Font.SizeInPoints.ToString("0.##"));
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,您将得到一些令人困惑的结果:
在对话框中选择11将产生11.25
在对话框中选择12将产生12
在对话框中选择14将产生14.25
在对话框中选择16将产生15.75
无论您选择哪种字体,都会出现此问题.从上面可以看出,差异中没有模式,它似乎在+0.25和-0.25之间随机变化.
我只是通过将字体大小显示为圆整数来解决这个问题,但我发誓我已经看到了允许用户选择小数字体大小的文字处理/ DTP包 - 而且这些包没有显示上述行为与Windows字体对话框交互时.
谁能为此提供合理的解释?是否有最佳实践技术在UI中显示字体大小?当用户想要像"10 .5"这样的小数时,怎么样?
我有一个.NET程序集,我已经添加了许多文件作为资源(二进制,每个> 500KB).我之前使用ResourceManager.GetObject()
自动生成的Resources
类上的方法访问它们,该类返回一个byte[]
.
出于性能和语法原因,我宁愿将这些二进制资源作为流而不是字节数组进行操作.我发现,通过手工编辑.resx文件,并在改变类的名称<value>
元素来自System.Byte[]
于System.IO.MemoryStream
,我是能够使用ResourceManager.GetStream()
方法成功地访问资源流,如
<data name="MyFile" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\MyFile.ext;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
Run Code Online (Sandbox Code Playgroud)
变为:
<data name="MyFile" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\MyFile.ext;System.IO.MemoryStream, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
Run Code Online (Sandbox Code Playgroud)
这种方法的唯一缺点是Visual Studio总是在byte[]
表单中添加新的文件资源.有没有办法让我为它设置类型MemoryStream
?
我正在执行几个长时间运行的SQL查询作为报告模块的一部分.这些查询是在运行时动态构造的.根据用户的输入,它们可以是单个或多个语句,具有一个或多个参数并在一个或多个数据库表上运行 - 换句话说,它们的形式不容易预料到.
目前,我只是在普通的情况下执行这些陈述SqlConnection
,即
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
Run Code Online (Sandbox Code Playgroud)
因为这些查询(实际上是查询批处理)可能需要一段时间才能执行,所以我担心会阻塞其他用户的读/写表.如果这些报告的数据在批处理执行期间发生变化,则不会出现问题.报表查询永远不应优先于这些表上的其他操作,也不应锁定它们.
对于涉及修改数据的大多数长时间运行/多语句操作,我会使用事务.这里的区别在于这些报告查询不会修改任何数据.我是否可以正确地将这些报告查询包装起来SqlTransaction
以控制它们的隔离级别?
即:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
这会实现我想要的结果吗?提交事务是否正确,即使没有修改数据?还有另一种方法吗?
我遇到了一个对我来说没有意义的编译器错误.我有一个internal
属性,我想限制它的set
块,使它只能通过继承.我认为这会奏效:
internal bool MyProperty {
get { return someValue; }
protected internal set { someValue = value; }
}
Run Code Online (Sandbox Code Playgroud)
但编译器说set
块上的访问修饰符需要比internal
- 我错过了什么,或者protected internal
不是更严格的限制internal
?
我正在编写一个执行多个连续SELECT
语句的存储过程.当我通过ADO.NET执行此过程时,我的目的是最终DataSet
包含几个DataTable
对象.这表现得如预期.
我目前依托于该表的顺序DataSet
匹配的顺序SELECT
在存储过程中的语句,但是真的是有顺序没有任何意义.最终必须维护程序的人不应该知道结果的预期顺序,维护申请的人也不应该知道程序中的陈述的顺序.
我想知道的是,是否可以SELECT
在存储过程本身的每个语句的结果中分配名称,然后通过ADO.NET(希望无缝地)通过它来通过它的名称来访问每个表它的订单?
例如
// populate DataSet with results from stored proc
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
// now access one of the resulting DataTable via name
return ds.Tables["NamedResultFromTheProc"];
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法实现这一目标?或者我是否必须依赖SELECT
语句的顺序并始终通过其索引访问所需的表?
我正在为Media Center(Windows 7附带的版本)编写一个加载项,并希望检索用户已包含在媒体库中的物理目录列表(图片,视频,录制的电视,电影,音乐) .
Media Center对象模型(Microsoft.MediaCenter.*
)似乎没有任何规定来获取此信息.
注册表有一个键HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Media Center\MediaFolders
,但这些键总是空的.
似乎有一个完整的目录列表%userprofile%\AppData\Local\Microsoft\Media Player\wmpfolders.wmdb
,但没有办法分辨每个目录与哪个媒体库有关,因为这些是Media Player的设置,它们的存在可能只是巧合.
有谁知道如何可靠地检索这些目录的列表,最好是从加载项程序集中(即使用C#)?
我已经将COM接口IPreviewHandler
导入WinForms应用程序并使用它来显示各种类型文档的预览(我在注册表中查找相应预览处理程序的GUID,然后用于Activator.CreateInstance(guid)
实例化特定的COM类.
这非常适用于绝大多数文件类型 - Office格式,PDF,视频等 - 但是,在我实例化"Microsoft Windows TXT预览处理程序"之后{1531d583-8375-4d3f-b5fb-d23bbd169f22}
,使用包含普通.txt文件的流初始化它,设置边界预览窗口,然后最后调用DoPreview()
,我得到一个异常,无法使用try ... catch捕获:
try {
Type comType = Type.GetTypeFromCLSID(guid);
object handler = Activator.CreateInstance(comType);
if (handler is IInitializeWithStream) {
Stream s = File.Open(filename, FileMode.Open);
// this just passes the System.IO.Stream as the COM type IStream
((IInitializeWithStream)handler).Initialize(new StreamWrapper(s), 0);
}
else {
throw new NotSupportedException();
}
RECT r = new RECT();
r.Top = 0;
r.Left = 0;
r.Right = hostControl.Width;
r.Bottom = hostControl.Height;
((IPreviewHandler)handler).SetWindow(hostControl.Handle, ref r); …
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×3
ado.net ×3
sql-server ×3
com ×1
dataset ×1
debugging ×1
delegates ×1
events ×1
font-size ×1
gdi+ ×1
generics ×1
lambda ×1
mediacenter ×1
properties ×1
resx ×1
sqlparameter ×1
stream ×1
transactions ×1
windows-7 ×1
winforms ×1