我一直在阅读很多关于.NET中浮点确定性的知识,即确保具有相同input的相同代码将在不同的机器上得到相同的结果。 由于.NET缺乏诸如Java的fpstrict和MSVC的fp:strict之类的选项, 所以共识似乎是使用纯托pipe代码无法解决此问题。 C#游戏人工智能战争已经决定使用定点math ,但这是一个繁琐的解决scheme。 主要的问题似乎是CLR允许中间结果存在于FPU寄存器中,这些寄存器的精度比types本身的精度要高,从而导致精确的结果难以预测。 CLR工程师David Notario的MSDN文章解释如下: 请注意,在目前的规范下,它仍然是一个提供“可预测性”的语言select。 在每次FP操作之后,语言可以插入conv.r4或conv.r8指令以获得“可预测”的行为。 很明显,这个代价很高,不同的语言有不同的折中。 例如,C#不做任何事,如果你想缩小,你将不得不手动插入(浮动)和(双)转换。 这表明可以简单地通过为每个expression式和子expression式插入明确的强制转换来实现浮点确定。 有人可能会写一个浮动types的包装types来自动完成这个任务。 这将是一个简单而理想的解决scheme! 其他意见却表明这并不是那么简单。 Eric Lippert最近表示 (强调我的): 在运行时的某个版本中,明确地转换为浮动会产生比不这样做的结果。 当你明确强制转换为浮点运算时,C#编译器给运行时提示 “如果碰巧使用了这种优化,就把它从超高精度模式中拿出来”。 这是什么“提示”到运行时? C#规范是否规定明确的强制转换会导致在IL中插入conv.r4? CLR规范是否规定conv.r4指令将价值缩小到原始大小? 只有这两者都是真实的,我们才能依靠明确的演员来提供浮点“可预测性”,正如David Notario所解释的那样。 最后,即使我们确实可以将所有中间结果强制转换为原始大小,这足以保证机器之间的可重复性,还是还有其他因素,如FPU / SSE运行时设置?
在我的WPF应用程序中,我单击解决scheme资源pipe理器中的Settings.settings ,然后input具有User范围的StringCollectionvariables: 替代文字http://i45.tinypic.com/24xdmir.png 在我的app.config中,我看到他们被保存在那里: <userSettings> <TestSettings.Properties.Settings> <setting name="Paths" serializeAs="Xml"> <value> <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <string>one</string> <string>two</string> <string>three</string> <string>four</string> <string>five</string> <string>six</string> <string>seven</string> </ArrayOfString> </value> </setting> </TestSettings.Properties.Settings> </userSettings> 然后我运行我的应用程序,并与此代码: StringCollection paths = Properties.Settings.Default.Paths; Properties.Settings.Default.Paths.Add("added in code"); Properties.Settings.Default.Save(); foreach (var path in paths) { System.Console.WriteLine(path); } 这给了我这个输出 : one two three four five six seven added in code 我再次运行该应用程序 […]
我怎样才能推出我自己的asynchronous等待方法? 我发现在某些情况下编写asynchronous方法很容易: private async Task TestGeo() { Geolocator geo = new Geolocator(); Geoposition pos = await geo.GetGeopositionAsync(); double dLat = pos.Coordinate.Latitude; double dLong = pos.Coordinate.Latitude; } …但是,不幸的是,也可以看到,不是任何方法都可以做到asynchronous无聊, 机智:这不起作用: private async Task TestAsyncAwait() { int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5); } 它阻止了我的编译错误,“不能等待int”; 在devise时间的一个提示同样告诉我,“types”int“不等于” 我也试过这个结果: Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5); 我必须做些什么来使我的方法等待? UPDATE 作为中后卫和S. Cleary表示(与曾经在KNBR上的猫有任何关系?),这是有效的: int i = await […]
在实现无锁数据结构和时间代码时,往往需要抑制编译器的优化。 通常情况下,人们在clobber列表中使用asm volatile和memory来做这件事,但是有时你会看到只是asm volatile或只是一个简单的asm clobbering memory。 这些不同的语句对代码生成有什么影响(特别是在GCC中,因为它不太可能是便携式的)? 仅供参考,这些是有趣的变化: asm (""); // presumably this has no effect on code generation asm volatile (""); asm ("" ::: "memory"); asm volatile ("" ::: "memory");
在entity framework中 – 在调用“SaveChanges”之前,有没有办法在事务中检索新创build的ID(标识)? 我需要第二次插入的ID,但它总是返回为0 … ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext; objectContext.Connection.Open(); using (var transaction = objectContext.Connection.BeginTransaction()) { foreach (tblTest entity in saveItems) { this.context.Entry(entity).State = System.Data.EntityState.Added; this.context.Set<tblTest>().Add(entity); int testId = entity.TestID; …. Add another item using testId } try { context.SaveChanges(); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); objectContext.Connection.Close(); throw ex; } } objectContext.Connection.Close();
背景 考虑以下: template <unsigned N> struct Fibonacci { enum { value = Fibonacci<N-1>::value + Fibonacci<N-2>::value }; }; template <> struct Fibonacci<1> { enum { value = 1 }; }; template <> struct Fibonacci<0> { enum { value = 0 }; }; 这是一个常见的例子,我们可以将斐波那契数的值作为编译时常量: int main(void) { std::cout << "Fibonacci(15) = "; std::cout << Fibonacci<15>::value; std::cout << […]
我已经在Win 7 RTM x64上创build了.NET C#WinForms应用程序,我们可以说我已经调用了DataInstaller。 当我在debugging器之外运行这个程序(只是一个没有function的空表单),直到我closures表单才能正常工作。 然后我从程序兼容性助手那里得到一条消息: 该程序可能没有正确安装 然后,我可以select使用推荐的设置重新安装,或者说安装按预期工作。 如果我命名应用程序“DataThingy”,这不是一个问题,我想这与名为* Setup的程序获得UAC盾牌图标的方式有关。 我认为会有一些简单的东西,我可以把应用程序清单,以防止这一点? 我不确定这是否发生在Vista上,因为我目前没有访问权限。 更改名称不是一个选项,closuresUAC不是一个选项,所以请不要这样做! 编辑: 我的天啊。 看来,如果以下任何一个是真的,UAC坚持它的桨: exe名称包含单词安装程序 AssemblyInfo.cs中 AssemblyTitle contains the word 'Installer' eg [assembly: AssemblyTitle("DataInstaller")] AssemblyProduct contains the word 'Installer' eg [assembly: AssemblyProduct("Data Installation Utility")] “安装程序”也可以是“安装程序”。 这是乞丐的信念,它确实如此。 很显然,一个老的VB6程序员被搬到了Redmond的UAC团队。 我仍然需要一个解决方法,我不准备接受我的应用程序不能被称为安装程序,因为它不会触摸registry或将任何文件放在Program Files文件夹中。 如果我试图执行名为IAmAVirus.exe的应用程序,我认为UAC会将机器置于完全locking状态。 (其实,我不敢尝试,因为我不完全相信我只是傻)
在C ++中,成员函数指针可以用来指向派生的(甚至是基类)成员吗? 编辑:也许一个例子会有所帮助。 假设我们按照inheritance的顺序有三个类X , Y , Z的层次结构。 因此, Y有一个基类X和一个派生类Z 现在我们可以为Y类定义一个成员函数指针p 。 这写成: void (Y::*p)(); (为了简单起见,我假定我们只对签名void f() )的函数感兴趣 这个指针现在可以用来指向Y类的成员函数。 这个问题(真的有两个问题)是: 可以用p指向派生类Z的函数吗? p可以用来指向基类X的函数吗?
我有一个类库,有几个只包含内部types的命名空间。 但是,在应用程序项目中使用类库时,名称空间显示为intellisense,但当然是空的。 在其他项目中使用intellisense时,是否有任何方法可以完全隐藏命名空间? 我试图将EditorBrowsableAttribute应用于所有内部类,但是我想要做的是将其应用于命名空间,这当然是不可能的。 或者,如果我足够关心这一点,唯一的select,我只是将types移动到一个名称空间,包含公共types?
我喜欢用.NET编程,特别是C#3.0,.NET 3.5和WPF。 但是我特别喜欢的是,Mono .NET真的是平台无关的。 现在我听说了单声道的橄榄项目。 我找不到某种Beta版本。 它已经工作了吗? 你有没有做过任何的经验? 编辑:我知道月光。 但是我想要一个独立的WPF应用程序。 而因为月光,我希望Linux上的WPF将成为现实。