如何有效地确保一个小数值至少有N个小数位
我想有效地确保十进制值至少具有n(在下面的示例中),在进行算术操作之前. . 显然我可以使用"0.000######....#"然后解析格式,但是它相对效率低,我正在寻找一种避免转换为/从字符串转换的解决方案. 我已经尝试了以下解决方案: decimal d = 1.23M; d = d + 1.000M - 1; Console.WriteLine("Result = " + d.ToString()); // 1.230 似乎适用于所有值Decimal.MaxValue - 1使用Visual Studio 2015在调试和发行版中编译时. ,但我有一个怀疑可以允许编译器优化(1.000-1). C#规范中是否有任何保证这将始终可用的? 或有更好的解决方案,例如使用Decimal.GetBits? 更新 跟进乔恩·斯基特(Jon Skeet)的答案,我以前曾尝试添加0.000M,但这对dotnetfiddle没有用.因此,我很惊讶地看到
10 2024-04-21
编程技术问答社区
C#规范(团队?委员会?)是否考虑过这种对象创建语法?
我以前从未发布过这种性质的问题,因此,如果不合适的话,请不要伤害我的感觉太糟糕了,我会删除它. 为了使我关心的一切都尽可能靠近左边边缘,我一直希望我能写出类似的内容: DataService1.DataEntities dataEntities = new(constructorArg1, ...) 我认为另一个原因是我喜欢在作业右侧已经存在类型时使用var获得的额外屏幕房地产,但是我的大脑在左侧寻找类型太多了.再说一次,被我的方式陷入困境并不是一个充分的理由,希望有规格... 解决方案 C#设计委员会是否曾经考虑过此对象创建语法? 是的,我们有.几年前,我们考虑过.作为此主张的证据,请参见我在此处的文章的最后一段: http://blogs.msdn . 设计团队的共识是,这是一个"拥有的功能",但并没有充分诱人的功能,值得设计,实施,测试,记录和维护该功能的成本相当大. 我还注意到,我链接到的博客条目的评论对该功能非常负面.似乎很多人发
2 2024-04-18
编程技术问答社区
C#和C++中的++i运算符的区别
我在C ++和C# 上写下以下代码 int i=0; ++i = 11; 此C#编译器带来错误 The left-hand side of an assignment must be a variable, property or indexer 但是C ++编译器生成此代码,没有任何错误,我得到了i的结果11.这种差异的原因是什么? 解决方案 区别在于,提前运算符是 lvalue ,而不是在C#中. 在C ++ ++i中返回对增量变量的引用.在c#++i中返回变量i的增量值. 因此,在这种情况下,++i是 lvalue 在C ++中, rvalue . 从C ++规范中有关前缀增量运算符 操作数的类型应为算术类型或指向 完全定义的对象类型.值是 操作数;它是 lvalue . P.S. Postfix增量运算符I ++在C#和C ++中都不是LVALUE,因此此代码行将带来两种语言的错误. int i=0; i++ = 11
18 2024-04-18
编程技术问答社区
关于Structs的问题
MSDN说,将更好地处理16个字节或更少的类别的类别 [citation] . 为什么那是? 这是否意味着,如果结构超过16个字节,则效率不如班级或相同? 您如何确定您的班级是否低于16个字节? 是什么限制了一个结构像班级一样? (除了不称呼无参数构造函数) 解决方案 这个问题有几个不同的答案,这有点主观,但是我能想到的一些原因是: struct s是值类型,class是参考类型.如果您正在使用16个字节进行总存储,那么为每个字节创建内存引用(4至8个字节)可能是不值得的. 当您有很小的对象时,通常可以将它们推到IL堆栈上,而不是引用对象.这确实可以加快某些代码,因为您可以消除卡莉一侧的内存解除. 与IL中的类有一些额外的"绒毛",如果您的数据结构很小,那么这些绒毛都不会使用,所以这只是您不需要的额外垃圾. 但是,struct和a class之间的最重要区别是struct s是值类型,而class是参考类型. 其他解决方案 通过"有效",他们可能在
4 2024-04-15
编程技术问答社区
运行时类型与编译时类型方法调用的比较
C#4.0规格阅读: 调用虚拟方法时,实例的运行时类型 调用发生的哪个确定实际方法 实施以调用.在非虚拟方法调用中, 实例的编译时类型是确定因素. 起初,我认为这与初始化有关.例如,给定两个初始化: BaseClass bcDerived = new Derived(); vs BaseClass bcBase = new BaseClass(); 和辅助类中的超载: public virtual void Method(Derived d) { Console.WriteLine("Result = derived called"); } public virtual void Method(BaseClass d) { Console.WriteLine("Result = base called"); } Method在这种情况下,virtual关键字不影响援引.无论标记virtual,都调用了最小得出的过载.仅在overri
10 2024-04-15
编程技术问答社区
操作符'=='不能应用于T类型?
我认为这种方法有效,但我错了: static void Equals(T x, T y) { return x == y; //operator == can't be applied to type T } 阅读指定后(v3.0中的§7.2.4和v4.0中的§7.3.4): 7.2.4二进制操作员超载分辨率 表格x的操作 op y,其中OP是可超载的 二进制操作员,x是 X型,Y是类型的表达 y,处理如下: 一组候选用户定义的运营商 由X和Y提供 确定操作员OP(X,Y).这 集合由 X和 由Y提供的候选运营商 每个使用规则 §7.2.5.如果x和y是相同的类型, 或者如果x和y是从一个派生的 常见的基本类型,然后共享 候选操作员仅出现在 组合一次. 如果集 候选用户定义的运营商是 不是空的,那就成为集合 候选运营商 手术.否则,预定义 二进制操作员OP实现, 包括他们提升的形式,成为 一组候选人运营商 手术.预定义 给定操作员的实
28 2024-04-13
编程技术问答社区
我在哪里可以找到C# 5语言规范?
C#5.0自2012年8月以来就已经发布.在哪里可以找到规格?他们已经停止执行ECMA规格,但是MSDN呢? 解决方案 最初是在线无法使用的,但是自2013年6月以来,它是可用从Microsoft下载. 其他解决方案 如果您安装了Visual Studio 2012,则可以在某处找到规格: c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications\1033\CSharp Language Specification.docx 与VS2013相似: c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033\CSharp Language Specification.docx VS2015: c:\Program Files (x86)\Microsoft Visual St
24 2024-04-12
编程技术问答社区
我在哪里可以找到C#语言规范6.0?
我知道在哪里可以找到 C#5语言规范 ,但我在任何地方都找不到C#6语言规范. c#6 语言规范在哪里? 解决方案 在撰写本文时(2016年5月)Microsoft尚未完成更新C#6的规格.同时,我在此处提出了Microsoft C#6规格的最新草稿: https://Github.com/ljw1004/csharpspec/blob/gh-pages/readme.md 此目前的草稿几乎完成了,除了剩下的一些待办事项评论和检查. (此版本已转换为GitHub+Markdown,但它也具有下载规格的DOCX和PDF版本的链接,以及以ANTLR格式下载语法的链接). 有关从C#5到C#6的所有规格更改的完整列表://github.com/ljw1004/csharpspec/pull/1/files (为什么微软还没有正式发布C#6规格?因为正在进行的工作以与ECMA保持一致,当然需要时间;在发布C上,花费花费很可惜#6规格现在仅具有后续版本的C#6规格后
22 2024-04-12
编程技术问答社区
Foreach在C#中是如何实现的?
foreach在C#? 中如何实现 我想象其中的一部分看起来像: var enumerator = TInput.GetEnumerator(); while(enumerator.MoveNext()) { // do some stuff here } 但是,我不确定到底发生了什么.对于每个周期,用于返回enumerator.Current什么方法?它是在[每个周期]返回的,还是需要匿名函数或执行foreach>? 的主体的东西 解决方案 它不使用匿名函数,否.基本上,编译器将代码转换为的某些,您在此处显示的while循环. foreach 不是 函数调用 - 它是语言本身的内置,就像for loops和while loops一样.它无需返回任何东西或"掌握"任何形式的函数. 请注意,foreach有一些有趣的皱纹: 在编译器上迭代(在编译时已知)时,编译器可以使用循环计数器并与数组的长度进行比较,而不是使用IEnumerator fore
20 2024-04-11
编程技术问答社区
为什么C#不允许通用属性?
我想知道为什么我不能像使用通用方法那样在非类别类中拥有通用属性.即: public interface TestClass { IEnumerable GetAllBy(); //this works IEnumerable All { get; } //this does not work } 我阅读@Jon Skeet的答案,但这只是一个说法,很可能是规格中的某个地方. 我的问题是为什么实际上是这样?是否避免了这种限制? 解决方案 从技术上讲,CLR仅支持通用类型和方法,而不是属性,因此问题是为什么未将其添加到CLR中.答案可能简单地说:"这并不认为带来足够的好处来值得成本". ,但从根本上说,它被认为没有任何好处,因为在语义上没有一种类型的属性参数是没有意义的. A Car类可能具有Weight属性,但是拥有Weight和Weight属性是没有意义的. 其他解决方案 此 gene
12 2024-04-11
编程技术问答社区
C#的短/长/int字面格式?
在C/C#/等中.您可以告诉编译器,字面数字不是看起来(即,float而不是double,unsigned long而不是int): var d = 1.0; // double var f = 1.0f; // float var u = 1UL; // unsigned long 等. 有人可以将我指向这些清单吗?我特别正在寻找short或Int16的后缀. 解决方案 var d = 1.0d; // double var d0 = 1.0; // double var d1 = 1e+3; // double var d2 = 1e-3; // double var f = 1.0f; // float var m = 1.0m; // decimal var i = 1; // int var ui = 1U; // uint var ul = 1UL; // ulong var l = 1L; // l
12 2024-04-10
编程技术问答社区
False == 0和True == 1是一个实现细节还是由语言保证的?
是否保证False == 0和True == 1,在Python中(假设用户未重新分配它们)?例如,是否以任何方式保证,以下代码始终会产生相同的结果,无论python版本(现有和可能的未来版本)是什么? ? 0 == False # True 1 == True # True ['zero', 'one'][False] # is 'zero' 对正式文档的任何引用将不胜感激! 如许多答案中所述,bool从int继承.因此,可以重新提出这个问题:"文档是否正式表明程序员可以依靠从整数继承的布尔人,带有值0和1 ?".这个问题与编写强大的代码有关,该代码不会因实施详细信息而失败! 解决方案 在Python 2.x中,这是不是,因为可以重新分配True和False.但是,即使发生这种情况,布尔值True和boolean false仍然可以正确返回以进行比较. python 3.x True和False是关键字,始终等于1和0. . 在Python
6 2024-04-01
编程技术问答社区
为什么Java中不允许用Foo(Object...)重载Foo(Object[])?
我想知道为什么在Java中不允许它以Foo(Object... args)> Foo(Object... args)过载,尽管它们以不同的方式使用? Foo(Object[] args){} 被使用: Foo(new Object[]{new Object(), new Object()}); 另一种形式: Foo(Object... args){} 被使用: Foo(new Object(), new Object()); 背后有什么原因? 解决方案 这个 15.12.2.5具体方法谈论这一点,但它很复杂.例如在foo(数字... ints)和foo(integer ... ints)之间进行选择 为了向后兼容,这些实际上是同一件事. public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){} // calls the varargs me
12 2024-03-03
编程技术问答社区
Rust中图元的评估顺序是什么?
元组元素可能具有副作用,其中一些元素可能取决于其他元素.考虑此程序: fn main() { let mut v = vec![1, 2]; match (v.pop(), v.pop()) { (Some(z), Some(y)) => println!("y = {}, z = {}", y, z), _ => unreachable!(), } } 它是否输出y = 1, z = 2或y = 2, z = 1?在 是否有记录的承诺或至少有意维护元组的评估顺序(例如,深度优先和从左到右)? 解决方案 是的,保证对元素的评估顺序是从左到右的(这也暗示着深度优先,因为该值必须完全构造). 不幸的是,这从来没有明确说明我能找到的任何地方,但是可以从Rust的强大向后兼容性中推断出来.对评估订单进行更改可能会引入太多的破损,无法认真考虑. 我还希望在安全的情况下允许优化器进行更改.例如,如果元组中的表达式
20 2023-10-27
编程技术问答社区
究竟什么是HTML5的<命令>标签,浏览器的支持情况如何?
我已经阅读了 html5 Spec for 并找到有关此元素的信息非常模糊. 我不明白该元素的用途是什么,即使我正确使用了. 我预先感谢您对此的任何澄清! 解决方案 它可以从窗户上使用Firefox 3.6.13. 命令元素旨在封装您可以做的事情.它可以在菜单中渲染(因为菜单显示您可以调用的项目). 想法 它提供了UI和命令之间的抽象层,因此您可以使多个UI元素参考同一命令.这为您提供了在菜单中呈现的一个命令元素的灵活性,该命令元素也可以通过页面中间的URL以及页面底部的按钮进行调用.禁用命令将所有访问路径(URL/按钮/菜单)禁用到命令后面的操作. 我们所处的位置 - 截至2010年1月26日 当前,有关如何将其链接到多个元素的信息非常稀少,实际上将起作用 (因为浏览器才刚刚开始实施!) ,但这是之一它的意图. 目前,唯一有记录的用法是提供一个语义上唯一的标签来指定(不使用或元素)
8 2023-10-14
编程技术问答社区
哪里规定了在Haskell实现中是否应允许Unicode标识符?
我想在标识符中使用Unicode字符(非拉丁)的Haskell编写一些教育代码. (因此,标识符对于不使用拉丁字符的英语以外的天然语言的说话者来说看起来不错,自然. 但是语言规范中的此功能在哪里指定?在寻找符合符合的实现时,我将如何参考此功能? (已知哪些Haskell启动实际上支持Unicode标识符?) 事实证明,一个Haskell实现确实接受了我的代码,而另一个Hastkell实施者则没有接受它.如果有一种方法可以以语言功能切换的形式形式化我的代码要求,我会喜欢它,这样,如果我或其他人试图运行我的代码所需的功能,因此他应该寻找另一个功能. (此功能也可能有一个Wiki页面 - " Unicode标识符",它将列出哪些现有实现支持它,以便如果需要的话,就会知道在哪里.) (顺便说一句,我在这个问题上放了一个"语法"标签,但是我实际上认为它是lexing级别的问题,比语言语法较低.语言的Lexing级别,而不是语言规范的特征?) 解决方案 在线报告在 lexeme
你能在 Python' 语法中添加新语句吗?
您可以添加新语句(例如print,raise,with) 说,允许.. mystatement "Something" 或, new_if True: print "example" 如果您应该,则不是那么多,而是可能(修改Python解释器代码) ) 解决方案 您可能会发现这很有用 - python internals:向python添加新语句,在这里引用: 本文试图更好地了解Python的前端如何工作.仅阅读文档和源代码可能有些无聊,所以我在这里采取动手操作:我将向Python添加until语句. 本文的所有编码都是针对 python mercurial python mercurial of until语句 某些语言,例如Ruby,具有until语句,这是对while的补充(until num == 0等于while num != 0).在Ruby,我可以写: num = 3 until num == 0 do p
18 2023-10-13
编程技术问答社区
关于Structs的问题
MSDN说,将更好地处理16个字节或更少的类别的类别 [citation] . 为什么那是? 这是否意味着,如果结构超过16个字节,则效率不如班级或相同? 您如何确定您的班级是否低于16个字节? 是什么限制了一个结构像班级一样? (除了不称呼无参数构造函数) 解决方案 这个问题有几个不同的答案,这有点主观,但是我能想到的一些原因是: struct s是值类型,class是参考类型.如果您正在使用16个字节进行总存储,那么为每个字节创建内存引用(4至8个字节)可能是不值得的. 当您有很小的对象时,通常可以将它们推到IL堆栈上,而不是引用对象.这确实可以加快某些代码,因为您可以消除卡莉一侧的内存解除. 与IL中的类有一些额外的"绒毛",如果您的数据结构很小,那么这些绒毛都不会使用,所以这只是您不需要的额外垃圾. 但是,struct和a class之间的最重要区别是struct s是值类型,而class是参考类型. 其他解决方案 通过"有效",他们可能在
24 2023-10-03
编程技术问答社区
根据Scala语言规范,软件包是AnyRef值,并且具有类型.这有什么意义?
我正在阅读Scala语言规范,我遇到了令人困惑的东西,即, packages是值,它们确实具有类型. 这是我从Scala语言规范中得出结论(也许是错误的?)的方式: 背景: 在 simpletype :: = stableId 类型指定器是指命名值 类型.它可以简单或合格.所有这样类型的指定者都是 类型预测的速记. 特别是,不合格的类型名称t,其中t绑定在某些中 类,对象或 package c 被视为c.this.type#t 的速记. 如果t不绑定在类,对象或软件包中,则将t视为 用于ε.type#t. 的速记 合格类型的指定器具有p.t的形式,其中p是一条路径,t 是类型名称.这样的类型指定器等效于类型 投影p.type#t. 某些类型的指定器及其扩展在下面列出.我们假设使用类型成员节点和标准类scala.int, 的局部类型参数t,a 值可维持 此外,通过考虑定义: SimpleType :: = SimpleType'#’I
68 2023-09-08
编程技术问答社区