在 CLR via C# 中,Richter 指出在类声明中初始化字段,就像这样
class C {
int x = 3;
int y = 4;
public C() { ... }
public C(int z) { ... }
...
}
导致在每个构造函数的开头插入语句,将字段设置为提供的值。因此,上面的 int x = 3; 行将负责两个单独的初始化——一个在无参数构造函数中,另一个在采用 int 参数的构造函数中。
里希特接着说:
This means that you should be aware of code explosion [...] If you have several initialized instance fields and a lot of overloaded constructor methods, you should consider defining the fields without the initialization, creating a single constructor that performs the common initialization, and having each constructor explicitly call the common initialization constructor. This approach will reduce the size of the generated code.
我无法想象这会成为一个值得注意的问题的场景,这让我想知道我是否遗漏了什么。例如,如果我们假设我们的类有 10 个构造函数和 100 个字段,并且它需要 16 个字节的本地机器代码来执行初始化,那么我们谈论的是总共 16 kB 的生成的本地代码。在本世纪以来的任何计算机上,这肯定是微不足道的内存量,对吧?
我认为使用泛型可以将其乘以一个小因子,但对工作集的影响似乎仍然很小。
问题:我是否遗漏了什么,如果遗漏了什么?
虽然我的问题主要是理论性的——我想测试我自己的理解——它也有点实际,因为初始化声明它们的字段似乎比使用像 Richter 建议的集中式构造函数产生的代码可读性要好得多.
最佳答案
What is a real-life example of detrimental code explosion caused by field initializations?
我不知道该问题的任何现实示例。
I'm having trouble envisioning a scenario in which this would become a noticeable issue
我也是。
which makes me wonder if I'm missing something here.
据我所知。
Surely that's a negligible amount of memory on any computer from this century, right?
没错。并且不要忘记,在一个困惑的世界中,您是为游戏付费的。您只能在调用时生成尽可能多的 ctors。
I imagine using generics could multiply that by a small factor
对于使用值类型构造的泛型类型,这通常是正确的。
but still the impact on the working set seems quite small.
再次强调,工作集是为游戏付费的。只被调用几次的代码最终会被换页,许多构造函数在程序中只被调用几次。
Am I missing something here, and, if so, what?
据我所知。
initializing the fields where they're declared seems to produce substantially more readable code than using a centralized constructor like Richter suggests.
我会首先针对正确性和优雅性进行优化,只有当经验性能测试清楚地表明这是一个真实的、影响用户的问题时,我才会解决这个问题。
关于c# - 由字段初始化引起的有害代码爆炸的真实示例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987537/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢