我有一个处理表达式树的库.该库需要与C#和VB.Net一起使用
注意到语言之间关于如何构造表达式树的一些差异
字符串比较
() => "a" == "b"变Expression.Equals("a", "b")
Function() "a" = "b"变Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
(我明白为什么VB.Net使用此处CompareString)
字符串连接
() => "a" + "b"变得Expression.Add("a", "b", String.Concat)
Function() "a" & "b"变得Expression.Call(String.Concat, "a", "b")
优化?
() => !(1 == 2)变得Expression.Not(Expression.Equals(1, 2))
Function() Not (1 = 2)变得Expression.NotEqual(1, 2)
我的图书馆处理所有这些差异,但是我需要注意更多的差异吗?
编辑 我的代码所做的一些解释.
我使用的系统有一个过滤器,您可以像这样指定文档:
var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
Run Code Online (Sandbox Code Playgroud)
为了更容易使用过滤器,我的代码允许您将过滤器指定为Expression<Func<bool>>lambda.
Expression<Func<bool>> filter = …Run Code Online (Sandbox Code Playgroud) 我对代码完整书中的段落感到有些困惑.
在"要避免的类"一节中,它写着:
"避免使用动词命名的类只有行为但没有数据的类通常不是一个类.考虑将类似DatabaseInitialization()或StringBuilder()的类转换为其他类的例程"
我的代码主要由没有数据的动词类组成.有发票阅读器,价格计算器,消息构建器等.我这样做是为了将每个类集中到一个任务.然后我将依赖关系添加到其他类以获取其他功能.
如果我正确理解了段落,我应该使用代码
class Webservice : IInvoiceReader, IArticleReader {
public IList<Invoice> GetInvoices();
public IList<Article> GetArticles();
}
Run Code Online (Sandbox Code Playgroud)
而不是
class InvoiceReader : IInvoiceReader {
public InvoiceReader(IDataProvider dataProvider);
public IList<Invoice> GetInvoices();
}
class ArticleReader : IArticleReader {
public ArticleReader(IDataProvider dataProvider);
public IList<Article> GetArticles();
}
Run Code Online (Sandbox Code Playgroud)
编辑 感谢所有回复.
我的结论是,我目前的代码比OO更多SRP,但它也受到"贫血领域模型"的影响.
我相信这些见解将来会对我有所帮助.
我试图找出Parallel.Foreach的异常和取消工作方式.所有示例似乎都涉及任务.
Parallel.Foreach中的异常会发生什么?
- 我将整个循环包装在try/catch(AggregateException)中吗?
- 循环中的所有其他任务,即使是尚未启动的任务,也会在异常被捕获之前运行完成吗?
与CancelationToken相同的问题
我有一个应用程序,需要从用户输入一些信息的按钮打开一个对话框.
目前我这样做(工作正常)
有很多步骤,但它们都有意义,并没有太多的打字.
代码看起来像这样(窗口要求输入用户名)
视图模型:
AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...
public event EventHandler<AskUserEventArgs> AskUserName;
void AskUserNameExecute(object arg) {
var e = new AskUserNameEventArgs();
AskUserName(this, e);
mModel.SetUserName(e.UserName);
}
Run Code Online (Sandbox Code Playgroud)
控制器:
mViewModel.AskUserName += (sender,e) => {
var view = container.Resolve<IAskUserNameView>();
var model = container.Resolve<IAskUserNameModel>();
var viewmodel = container.Resolve<IAskUserNameViewModel>(view, model);
if (dlg.ShowDialog() ?? false)
e.UserName = model.UserName;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是水平通信如何在MVVM模式中工作.不知何故,让控制器参与模型之间的数据传输似乎是错误的.
我已经查看了中介模式,让模型直接进行通信.不喜欢这个想法,因为它使模型取决于GUI的实现细节.(即如果用文本框替换对话框,模型需要更改)
该nuspec参考说,有关阅读发布标签
v1.5每个软件包版本中所做更改的说明.此字段仅在选择" 更新"选项卡时显示,并且包是对先前安装的包的更新.它显示在通常显示描述的位置.
我创建了两个nuspec文件,两个都包含(version当然有不同的标签)
<?xml version="1.0"?>
<package >
<metadata>
<id>TestReleaseNotes</id>
<version>1.0</version>
<authors>adrianm</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Description</description>
<releaseNotes>Release notes</releaseNotes>
</metadata>
<files>
<file src="Test.cs" target="content" />
</files>
</package>
Run Code Online (Sandbox Code Playgroud)
我在VS2013中安装了1.0并选择了更新选项卡但我看不到发行说明.

我错过了什么?
很久以前来自C/C++,我仍然习惯于确保所有资源都得到正确清理.我总是确保在IDisposable类上调用Dispose,并在包含一次性对象的类中实现Dispose模式.
但是,在我的环境中,我或多或少是唯一一个这样做的人.其他人只是不明白我在做什么,并认为我的代码更难理解.
他们只是创建数据库连接,打开流等,而无需调用Close或Dispose.有时他们会在方法结束时将局部或成员变量设置为"Nothing"(猜测它们的背景).
我的问题是他们的代码和我的代码一样好用.随着时间的推移创建数千个数据库连接对象的代码才有用.
因此,忽略关于代码正确性的任何争论,遵循指南等,IDiposable真的重要吗?
有没有人实际上没有使用Disposing对象的资源?
编辑: 感谢所有回复.有趣的是,有些人在没有处理时遇到了问题.这似乎很少见,我认为GC/JIT在正常条件下保持资源使用率下降方面做得很好.
我的同事和我都不会因此而改变行为,但感觉良好是正确的.
为什么我不能创建触发器并将其用作XAML中的静态资源?
<Window.Resources>
<Trigger x:Key="ValidationTrigger" x:Shared="False" Property="Validation.HasError" Value="true">
<Setter Property="FrameworkElement.ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)/ErrorContent}"/>
</Trigger>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Style.Triggers>
<StaticResource ResourceKey="ValidationTrigger"/>
</Style.Triggers>
</Style>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
我在运行时得到一个错误消息
"值不能为null.
参数名称:标记文件中对象'System.Windows.Markup.StaticResourceHolder'的触发错误"
当我编写SQL时,我尝试使其尽可能可读.除了其他东西,我经常声明"常量"而不是使用"魔术数字".
即代替
WHERE [Order].OrderType = 3
Run Code Online (Sandbox Code Playgroud)
我做
DECLARE @OrderType_Cash AS int = 3;
...
WHERE [Order].OrderType = @OrderType_Cash
Run Code Online (Sandbox Code Playgroud)
这工作正常,我没有注意到我通常使用的查询和数据大小的任何性能问题.
最近我读了一篇关于参数嗅探和变通方法的文章(https://blogs.msdn.microsoft.com/turgays/2013/09/10/parameter-sniffing-problem-and-possible-workarounds/).在本文中,提出的解决方法之一是"使用局部变量".
- 解决方法:使用局部变量 - 此变通方法与前一个变量非常相似(OPTION(OPTIMIZE FOR(@VARIABLE UNKNOWN))) - 当您将参数分配给本地变量时,SQL Server使用统计密度而不是统计直方图 - 所以它估计相同所有参数的记录数 - 缺点是一些查询将使用次优计划,因为密度不足以作为统计直方图.
这让我有点担心,因为我的解释是我可能在我的存储过程中得到一个不理想的计划,因为我使用局部变量而不是"幻数".
我还认为SQL Server会自动将"幻数"转换为变量,以便重用计划.
有人可以为我清除这个吗?
我无法让Tortoisehg(1.0)与subrepos合作
我有这样的目录结构:
root
.hg
.hgsub
.hgsubstate
Customer1
Project1
.hg
foo.txt
Project2
.hg
Customer2
Project3
.hg
Run Code Online (Sandbox Code Playgroud)
root下的.hgsub文件看起来像
Customer1\Project1=Customer1\Project1
Customer1\Project2=Customer1\Project2
Customer2\Project3=Customer2\Project3
Run Code Online (Sandbox Code Playgroud)
如果修改文件Customer1\Project1\foo.txt并从根提交它可以工作
>hg ci -m "command line commit"
committing subrepository customer1\project1
Run Code Online (Sandbox Code Playgroud)
在Tortoisehg customer1\project1中显示状态S(subrepo)但在提交时我收到一条消息
abort: customer1/project1: no match under directory!
Run Code Online (Sandbox Code Playgroud)
是不支持这种情况还是我做错了什么?
该文档说:
"TortoiseHg 1.0引入了对子库的基本支持,并且仅在提交/状态工具中.当Mercurial认为subrepo为脏时,它将作为文件列表中的特殊条目出现在提交工具中,状态为S如果子提要包含在提交的文件列表中,则子提示与其他更改一起提交,更新主存储库根目录中的.hgsubstate文件.
我正在VS2013中开发Visual Studio扩展,但我可以在实验实例中加载它.
我可以在我当前的实例(来自vsix文件)中手动安装它,它工作正常,但我无法调试它.
ActivityLog中没有任何错误消息也没有任何内容.我的扩展程序没有加载.(这不仅仅是我的扩展.同样的事情发生在项目模板的新扩展中)
我试图删除/重置实验实例没有运气.
我还尝试通过安装我的扩展程序从当前实例创建实验实例来调试我的扩展.然后,扩展在实验实例中的"扩展和更新"中显示为"已禁用".
试图搜索在实验实例中如何执行扩展注册但找不到任何内容.仅找到对"将VSIX内容部署到实验实例以进行调试"设置的引用,而不是设置的内容.
目前我的测试工作很喜欢这样:
这当然需要很长时间.
c# ×2
wpf ×2
.net ×1
class-design ×1
dialog ×1
idisposable ×1
mercurial ×1
mvvm ×1
nuget ×1
nuspec ×1
resources ×1
sql-server ×1
subrepos ×1
tortoisehg ×1
triggers ×1
vb.net ×1
vsix ×1
vspackage ×1
xaml ×1