小编enz*_*nzi的帖子

通过转换为uint而不是检查负值来执行范围检查是否更有效?

我在.NET的List源代码中偶然发现了这段代码:

// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
  ThrowHelper.ThrowArgumentOutOfRangeException();
}
Run Code Online (Sandbox Code Playgroud)

显然这比(?)更有效 if (index < 0 || index >= _size)

我很好奇这个技巧背后的理由.单个分支指令真的比两个转换要贵uint吗?或者是否还有一些其他优化会使这个代码比另外的数字比较更快?

为了解决房间里的大象:是的,这是微优化,不,我不打算在我的代码中到处使用它 - 我只是好奇;)

c# performance micro-optimization numeric-conversion range-checking

77
推荐指数
5
解决办法
4439
查看次数

如果我不等待任务会怎样?

考虑这个例子:

var task = DoSomething()
bool ready = await DoSomethingElse();
if (!ready) 
  return null;

var value = await DoThirdThing(); // depends on DoSomethingElse
return value + await task;
Run Code Online (Sandbox Code Playgroud)

DoSomething做一些可能需要一段时间的非常重要的工作,因此我们首先开始它.
与此同时,我们检查我们是否准备就绪,DoSomethingElse如果没有,我们会提前退出.
我们DoThirdThing 只有在我们这样做时才会打电话ready,因为宇宙可能会爆炸.

我们不能用Task.WhenAll作为DoThirdThing依赖DoSomethingElse,我们也不想等待DoSomething,因为我们希望尽可能地其他两种方法同时调用.

问题:发生什么task,如果我们不能ready和退出早?

它抛出的任何异常会被重新抛出SynchronizationContext吗?
如果task正常完成会有问题吗,因为没有人消耗它的价值?

后续行动:有没有一种简洁的方法可以确保task等待?

我们可以简单地说,await task如果我们不是ready,但如果有50个退出条件,这将是非常繁琐的.
可以使用finally块来await task重新抛出潜在的异常吗?如果task正常完成,将在finally块中再次等待,但这不应该导致任何问题?

c# async-await

28
推荐指数
1
解决办法
5669
查看次数

我是否必须包含所有System.Collections.Immutable依赖项?

我只是从(一个较旧的)Microsoft.Bcl.ImmutableNuGet包切换到System.Collections.Immutable并且很惊讶在我的项目中找到所有这些新的包依赖项:

System.Collections
System.Diagnostics.Debug
System.Globalization
System.Linq
System.Resources.ResourceManager
System.Runtime
System.Runtime.Extensions
System.Threading
Run Code Online (Sandbox Code Playgroud)

它们被列为NuGet包的依赖项,因此它们有权在那里,但它们显然也已经安装在我的PC和我的目标环境(Azure btw)上,因为它们随框架一起提供.

我已经在我的项目中有大量的软件包,并且如果可能的话,我希望避免由这8个软件包引起的额外开销(并且不会在脚下拍摄自己).

删除这些依赖项是否安全?
我现在是否必须在整个项目中使用这些软件包,因为它们可能与已安装的版本不同,我的项目的某些部分现在可能使用了错误的软件包?(由于某些DLL连接疯狂?)

编辑:只是为了完整性,因为之前有一个评论:依赖项是实际的包(不是名称空间),必须下载,我的目标是使用.NET 4.6进行编译,在VS2015中工作.虽然有些东西已经过时且包装不需要正常加载,但这是完全可能的吗?

.net c# nuget nuget-package immutable-collections

24
推荐指数
1
解决办法
7279
查看次数

有关DSL设计的书籍/论文吗?(不是DSL实施)

我必须为非程序员(我们公司的客户)创建一个DSL,它需要提供一些更高级的语言功能(循环,条件表达式,变量......)所以它不仅仅是一个"简单的"DSL.

使用DSL应该很容易; 人们应该能够尝试并通过玩耍来学习它.我们希望在Microsoft Excel中实现与宏类似的东西 - 许多Excel用户可以创建简单的公式,求和或计算,并且从未使用过"真正的"(通用)编程语言.

显然并非每个Excel用户都能理解更复杂的内置方法(如When()),但他们可以使用简单的方法,如SUM()或AVG().我想用DSL实现类似的效果 - 用户应该能够直观地使用它并定义简单的规则或执行简单的计算.同时,DSL应该为更具技术倾向的循环,if语句,可能的方法或lambdas提供更高级别的功能.

这引出了我的问题:什么语言结构直观,易于学习和理解?

在DSL的当前实验版本中,我们尝试了一种方法链接方法,例如:) list.where(item -> item.value > 5).select(item -> item.name + " " + item.value).可以想象where并且select作为foreach构造在哪里item是表示循环中当前项的变量.

我们首先尝试这种方法的原因是支持代码完成很容易 - 只要用户输入句点(.),就会显示可能的方法列表.但是我不确定这个概念是否符合我的直观,易于理解和阅读的标准.

如果没有大括号,用户是否更容易/更易读?(比如在LINQ :) from item in list where item.value > 5 select item.name + " " + item.value.但是在这种情况下,没有"边界" - 在前面的例子中,用户知道语句以最后一个结束括号结束 - 在这种情况下,如果他select在语句的一部分之后输入更多代码,他就不知道如果它属于语句或者不属于语句(除了解析器不知道的事实,并且必须有某种关闭).

我希望我的问题对这两个例子更清楚一点 - 我正在寻找设计指南,最佳实践,现实生活经验,可能是哪些语言结构对其他人有利的研究材料 - 或某些对某些方面的利弊评价语言结构.

我不是在寻找有关如何创建DSL的信息,关于我可以使用的解析器生成器等等.我也不能使用现有的通用语言(Ruby,Python,...)而是因为使用DSL.(DSL在解析时直接与我们的对象模型一起工作 - 我不会在这里详细介绍,因为这个问题已经足够长了).

编辑:也许我应该指出,"语言结构"是指语法,写入的方式,而不是语言应该提供的功能 - 我们已经有了DSL必须提供的功能列表.问题是如何最好地表达这些特征以允许创建(和维护)简单和复杂的公式.

dsl language-design

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

使用Team Foundation Server提高工作效率的技巧和窍门

我必须在我的公司使用Team Foundation Server 2010,我对此并不满意.有很多功能或只是默认行为,我期望TFS似乎缺乏一个CVS(与我经验过的svn,git或perforce相比),所以我的问题是:你知道哪些技巧,哪些隐藏功能是什么让TFS更容易使用/更方便?

也许我应该详细说明并列出我认为可能更好的内容:

  • 与任务关联时的默认签入操作是"解决",但在99%的签入中,我只想将我的提交与任务"关联".只有1个提交(最后一个)"解析"任务,那么为什么这是默认值?我可以改变吗?

  • 在签入对话框中,双击文件时,将启动记事本并显示该文件的内容.记事本.真的吗?那么Visual Studio编辑器呢?无论如何,我希望看到差异来审查我所做的更改,而不是文件的内容.diff工具隐藏在子菜单中.这看起来似乎微不足道,但是当我必须检查10个以上的文件时,总是右键单击,打开子菜单,点击差异就很烦人.

  • 差异工具.与它合并并不是很简单,冲突检测机制也有些缺乏.(Tortoise-)SVN/Git合并工具或Perforce的合并工具在这里更好.

  • 速度.创建新文件,首次打开文件,将文件与先前版本进行比较等需要永远(即3-10 +秒).我们的TFS服务器是内部的,完全没有负载 - 当我创建一个新文件(我甚至可能不会检查)时,为什么Visual Studio必须联系TFS服务器?是否可以选择关闭它?

  • 只读文件.所有文件在签入时都是只读的,并且在第一次编辑时变为可写.当应用程序因此而崩溃时,这真的很不错.例如,Windows Azure会修改web.config文件,并在我签出时失败,因为该文件是只读的.

这些只是我认为非常烦人且不必要的最突出的事情.我没有兴趣进行分支和合并,但从我到目前为止听到的内容来看,它也不会很愉快......

再说一次:如果你知道一些技巧,设置,使得使用TFS不那么不方便的功能,请分享它们.

tfs

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

如何推断基类中派生类的类型?

我想创建一个方法,允许我更改从我的基类派生的类的任意属性,结果应如下所示:SetPropertyValue("size.height", 50);- where size是我的派生类height的属性,是一个属性size.

我差不多完成了我的实现,但是在继续之前我想要解决的最后一个障碍,为了描述这个,我首先要解释一下我的实现:

  • 可以修改的属性使用属性进行修饰
  • 我的基类中有一个方法可以搜索所有派生类及其修饰属性
  • 对于每个属性,我生成一个"属性修饰符",一个包含2个委托的类:一个用于设置,另一个用于获取属性的值.
  • 属性修饰符存储在字典中,属性的名称为键
  • 在我的基类中,有另一个包含所有property-modifier-dictionaries的字典,其中相应类的Type作为键.

SetPropertyValue方法的作用是:

  • 使用派生类的具体类型获取正确的property-modifier-dictionary(< - 尚未解决)
  • 获取要更改的属性的属性修饰符(例如属性size)
  • 使用get或set委托修改属性的值

一些示例代码进一步澄清:

private static Dictionary<RuntimeTypeHandle, object> EditableTypes; //property-modifier-dictionary

protected void SetPropertyValue<T>(EditablePropertyMap<T> map, string property, object value) {
  var property = map[property]; // get the property modifier
  property.Set((T)this, value); // use the set delegate (encapsulated in a method)
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,T是实际(派生)类的类型.我需要这种类型的get/set委托.问题是如何在EditablePropertyMap<T>不知道T是什么时获得.

我当前(丑陋)的解决方案是在派生类中的覆盖虚方法中传递映射:

public override void SetPropertyValue(string property, object value) {
  base.SetPropertyValue((EditablePropertyMap<ExampleType>)EditableTypes[typeof(ExampleType)], property, …
Run Code Online (Sandbox Code Playgroud)

c# generics type-inference

5
推荐指数
1
解决办法
1188
查看次数

如何在Azure表存储中使用整数RowKeys?

我有连续编号的实体,我想坚持使用Azure表服务,但RowKey列的类型是有问题的.实体的数量应该存储在RowKey列中,这样我就可以查询实体fast(PK = '..' && RowKey = 5),获取最新的实体(RowKey > 10)并查询某组实体(RowKey > 5 && RowKey < 10).

由于RowKey必须是一个字符串,因此低于比较是有问题的("100" < "11").我想过在数字前面加零(这样"100" > "011"),但我无法预测实体的数量(以及零的数量).

我知道我可以创建一个整数列,但是我会放弃索引的RowKey列的性能优势(另外我没有任何其他适合RowKey的信息).以前有人有这个问题吗?

c# azure azure-storage

5
推荐指数
1
解决办法
3792
查看次数

为什么更新外键后引用约束不一致?

抱歉这个模糊的标题,很难用一行描述:

我有2个实体UserUserAddress,其中用户有2个外键DefaultInvoiceAddressIdDefaultDeliveryAddressId和UserAddress有一个UserId外键.

用户对象具有默认地址(DefaultInvoiceAddressDefaultDeliveryAddress)的导航属性以及用于其所有地址的导航属性:AllAddresses.

映射等工作,创建和更新用户和地址也有效.

但是不起作用的是将用户的现有地址设置为例如DefaultInvoiceAddress.在SQL术语中,我想要发生的是UPDATE USER SET DefaultInvoiceAddressId = 5 WHERE Id = 3.

我试过以下方式:

private void MarkAs(User user, UserAddress address, User.AddressType type) {
        if (context.Entry(user).State == EntityState.Detached)
            context.Users.Attach(user);

        // guess I don't really need this:
        if (context.Entry(address).State == EntityState.Detached)
            context.UserAddresses.Attach(address);

        if (type.HasFlag(User.AddressType.DefaultInvoice)) {
            user.DefaultInvoiceAddressId = address.Id;
            user.DefaultInvoiceAddress = null;
            context.Entry(user).Property(u => u.DefaultInvoiceAddressId).IsModified = true;
        }

        if (type.HasFlag(User.AddressType.DefaultDelivery)) {
            user.DefaultDeliveryAddressId = address.Id; …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework foreign-key-relationship sql-update entity-framework-5

5
推荐指数
1
解决办法
5480
查看次数

如何自定义Docfx文档(主题或模板)?

我刚开始使用Docfx并设置了一些基本的概念文档.现在我想对主题进行一些调整(公司徽标,也许是一些字体更改等).

官方文档只给出了如何创建一个新的模板高级描述.我之前从未使用过模板语言,所以如果可能的话,我现在想避免使用它.

我的问题是:我如何对默认主题进行小幅调整,比如一些CSS更改以及可能添加外部资源(如字体真棒)?

我是否必须创建整个模板(或其中的一部分),还是可以以某种方式包含CSS文件?该文档提到了一个theme选项,但到目前为止,我还没有找到任何示例或现有主题可供学习.

仅使用自定义主题或模板的项目链接已经非常有用.该docfx回购有一个docfx.website.themes文件夹,默认模板也是在那里,我相信,但我不能真正弄明白我会该文件提供推出自己的.

documentation-generation docfx

5
推荐指数
1
解决办法
3582
查看次数

AspNetCore.SignalR 发行说明在哪里?

我们有频繁断开连接的问题,并正在使用Microsoft.AspNetCore.SignalR的版本1.0.3

有 1.0.4 和 1.1.0 版本,所以我想我会检查发行说明,看看它是否可能是一个已修复的问题。

但是,我一生都找不到这些软件包的任何发行说明。

Nuget 指向一个存档的存储库,该存储库包含发布但没有注释,甚至没有修复其中的问题的标签。新的存储库 AspNet.Core 只有自己的发行说明,根本没有提到 SiganlR 包或使用哪个版本。我找不到任何标签或维基条目或降价文档。

找到发行说明应该不难;我是被瞎眼诅咒了还是真的不能拥有?

asp.net-core asp.net-core-signalr

5
推荐指数
1
解决办法
674
查看次数