小编adr*_*anm的帖子

C#和VB.Net之间的表达式树差异

我有一个处理表达式树的库.该库需要与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)

c# vb.net expression-trees

49
推荐指数
1
解决办法
1879
查看次数

要避免的类(代码完成)

我对代码完整书中的段落感到有些困惑.

在"要避免的类"一节中,它写着:

"避免使用动词命名的类只有行为但没有数据的类通常不是一个类.考虑将类似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,但它也受到"贫血领域模型"的影响.

我相信这些见解将来会对我有所帮助.

class-design code-complete

38
推荐指数
3
解决办法
1510
查看次数

Parallel.Foreach异常并取消

我试图找出Parallel.Foreach的异常和取消工作方式.所有示例似乎都涉及任务.

Parallel.Foreach中的异常会发生什么?
- 我将整个循环包装在try/catch(AggregateException)中吗?
- 循环中的所有其他任务,即使是尚未启动的任务,也会在异常被捕获之前运行完成吗?

与CancelationToken相同的问题

c# exception-handling task-parallel-library

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

在WPF MVVM中打开对话框

我有一个应用程序,需要从用户输入一些信息的按钮打开一个对话框.

目前我这样做(工作正常)

  • 单击按钮会在ViewModel中生成一个命令.
  • ViewModel引发Controller监听的事件.
  • Controller计算出新窗口的细节(即View,ViewModel和model)并打开它(ShowDialog)
  • 当窗口关闭时,Controller将结果添加到eventargs并返回ViewModel
  • ViewModel将信息传递给Model.

有很多步骤,但它们都有意义,并没有太多的打字.

代码看起来像这样(窗口要求输入用户名)

视图模型:

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的实现细节.(即如果用文本框替换对话框,模型需要更改)

wpf dialog mvvm

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

显示nuget包发布说明

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并选择了更新选项卡但我看不到发行说明. Nuget更新

我错过了什么?

nuget nuspec visual-studio-2013

13
推荐指数
3
解决办法
4132
查看次数

IDisisposable,它真的很重要

很久以前来自C/C++,我仍然习惯于确保所有资源都得到正确清理.我总是确保在IDisposable类上调用Dispose,并在包含一次性对象的类中实现Dispose模式.

但是,在我的环境中,我或多或少是唯一一个这样做的人.其他人只是不明白我在做什么,并认为我的代码更难理解.

他们只是创建数据库连接,打开流等,而无需调用Close或Dispose.有时他们会在方法结束时将局部或成员变量设置为"Nothing"(猜测它们的背景).

我的问题是他们的代码和我的代码一样好用.随着时间的推移创建数千个数据库连接对象的代码才有用.

因此,忽略关于代码正确性的任何争论,遵循指南等,IDiposable真的重要吗?

有没有人实际上没有使用Disposing对象的资源?

编辑: 感谢所有回复.有趣的是,有些人在没有处理时遇到了问题.这似乎很少见,我认为GC/JIT在正常条件下保持资源使用率下降方面做得很好.

我的同事和我都不会因此而改变行为,但感觉良好是正确的.

.net resources idisposable

11
推荐指数
2
解决办法
452
查看次数

XAML触发器作为StaticResource

为什么我不能创建触发器并将其用作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'的触发错误"

wpf xaml triggers

11
推荐指数
1
解决办法
2452
查看次数

是否应该在存储过程中避免常量的局部变量?

当我编写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/).在本文中,提出的解决方法之一是"使用局部变量".

  1. 解决方法:使用局部变量 - 此变通方法与前一个变量非常相似(OPTION(OPTIMIZE FOR(@VARIABLE UNKNOWN))) - 当您将参数分配给本地变量时,SQL Server使用统计密度而不是统计直方图 - 所以它估计相同所有参数的记录数 - 缺点是一些查询将使用次优计划,因为密度不足以作为统计直方图.

这让我有点担心,因为我的解释是我可能在我的存储过程中得到一个不理想的计划,因为我使用局部变量而不是"幻数".

我还认为SQL Server会自动将"幻数"转换为变量,以便重用计划.

有人可以为我清除这个吗?

  • 使用"幻数"和局部变量之间有区别吗?
  • 如果是,是仅在存储过程中还是也适用于即席查询和动态SQL?
  • 像我一样使用局部变量是一个坏习惯吗?

sql-server stored-procedures

10
推荐指数
1
解决办法
924
查看次数

tortoisehg和subrepos

我无法让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文件.

mercurial tortoisehg subrepos

9
推荐指数
2
解决办法
8675
查看次数

Visual Studio扩展不会在实验实例中加载

我正在VS2013中开发Visual Studio扩展,但我可以在实验实例中加载它.

我可以在我当前的实例(来自vsix文件)中手动安装它,它工作正常,但我无法调试它.

ActivityLog中没有任何错误消息也没有任何内容.我的扩展程序没有加载.(这不仅仅是我的扩展.同样的事情发生在项目模板的新扩展中)

我试图删除/重置实验实例没有运气.

我还尝试通过安装我的扩展程序从当前实例创建实验实例来调试我的扩展.然后,扩展在实验实例中的"扩展和更新"中显示为"已禁用".

试图搜索在实验实例中如何执行扩展注册但找不到任何内容.仅找到对"将VSIX内容部署到实验实例以进行调试"设置的引用,而不是设置的内容.

目前我的测试工作很喜欢这样:

  1. 放入MessageBox和/或WriteLine并编译代码
  2. 在"扩展和更新"中删除以前的扩展实例
  3. 关闭Visual Studio
  4. 从vsix文件安装扩展
  5. 启动Visual Studio
  6. 测试扩展

这当然需要很长时间.

vspackage vsix visual-studio-extensions visual-studio-2013

9
推荐指数
1
解决办法
3975
查看次数