// 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
考虑这个例子:
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块中再次等待,但这不应该导致任何问题?
我只是从(一个较旧的)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中工作.虽然有些东西已经过时且包装不需要正常加载,但这是完全可能的吗?
我必须为非程序员(我们公司的客户)创建一个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必须提供的功能列表.问题是如何最好地表达这些特征以允许创建(和维护)简单和复杂的公式.
我必须在我的公司使用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不那么不方便的功能,请分享它们.
我想创建一个方法,允许我更改从我的基类派生的类的任意属性,结果应如下所示:SetPropertyValue("size.height", 50);- where size是我的派生类height的属性,是一个属性size.
我差不多完成了我的实现,但是在继续之前我想要解决的最后一个障碍,为了描述这个,我首先要解释一下我的实现:
该SetPropertyValue方法的作用是:
size)一些示例代码进一步澄清:
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) 我有连续编号的实体,我想坚持使用Azure表服务,但RowKey列的类型是有问题的.实体的数量应该存储在RowKey列中,这样我就可以查询实体fast(PK = '..' && RowKey = 5),获取最新的实体(RowKey > 10)并查询某组实体(RowKey > 5 && RowKey < 10).
由于RowKey必须是一个字符串,因此低于比较是有问题的("100" < "11").我想过在数字前面加零(这样"100" > "011"),但我无法预测实体的数量(以及零的数量).
我知道我可以创建一个整数列,但是我会放弃索引的RowKey列的性能优势(另外我没有任何其他适合RowKey的信息).以前有人有这个问题吗?
抱歉这个模糊的标题,很难用一行描述:
我有2个实体User和UserAddress,其中用户有2个外键DefaultInvoiceAddressId和DefaultDeliveryAddressId和UserAddress有一个UserId外键.
用户对象具有默认地址(DefaultInvoiceAddress和DefaultDeliveryAddress)的导航属性以及用于其所有地址的导航属性: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
我刚开始使用Docfx并设置了一些基本的概念文档.现在我想对主题进行一些调整(公司徽标,也许是一些字体更改等).
在官方文档只给出了如何创建一个新的模板高级描述.我之前从未使用过模板语言,所以如果可能的话,我现在想避免使用它.
我的问题是:我如何对默认主题进行小幅调整,比如一些CSS更改以及可能添加外部资源(如字体真棒)?
我是否必须创建整个模板(或其中的一部分),还是可以以某种方式包含CSS文件?该文档提到了一个theme选项,但到目前为止,我还没有找到任何示例或现有主题可供学习.
仅使用自定义主题或模板的项目链接已经非常有用.该docfx回购有一个docfx.website.themes文件夹,默认模板也是在那里,我相信,但我不能真正弄明白我会该文件提供推出自己的.
我们有频繁断开连接的问题,并正在使用Microsoft.AspNetCore.SignalR的版本1.0.3。
有 1.0.4 和 1.1.0 版本,所以我想我会检查发行说明,看看它是否可能是一个已修复的问题。
但是,我一生都找不到这些软件包的任何发行说明。
Nuget 指向一个存档的存储库,该存储库包含发布但没有注释,甚至没有修复其中的问题的标签。新的存储库 AspNet.Core 只有自己的发行说明,根本没有提到 SiganlR 包或使用哪个版本。我找不到任何标签或维基条目或降价文档。
找到发行说明应该不难;我是被瞎眼诅咒了还是真的不能拥有?
c# ×6
.net ×1
asp.net-core ×1
async-await ×1
azure ×1
docfx ×1
dsl ×1
generics ×1
nuget ×1
performance ×1
sql-update ×1
tfs ×1