在深入研究我的类设计之前,我只是想检查一下我对 C# 处理事物的方式的理解。我目前的理解是:
Struct 是一种值 类型,意味着它实际上包含定义在其中的数据成员。Class 是一种引用 类型,这意味着它包含对其中定义的数据成员的引用。
方法签名通过值传递参数,这意味着值的副本被传递到方法内部,这对于大型数组和数据结构来说是昂贵的。
我不明白的是当我调用一个方法时会发生什么,实际发生了什么。 new() 是否被调用?它只是自动复制数据吗?或者它实际上只是指向原始对象?使用 ref 和 out 对此有何影响?
最佳答案
What I don't understand is what happens when I invoke a method, what actually happens. Does new() get invoked? Does it just automagically copy the data? Or does it actually just point to the original object? And how does using ref and out affect this?
空构造函数不会被自动调用,它实际上只是指向原始对象。
使用 ref 和 out 不会影响这一点。
我认为理解 C# 如何处理向函数传递参数会更容易。
实际上一切都是按值
传递的
真的吗?!一切都按值(value)?
是的!一切!
当然,传递类和简单类型对象(例如 Integer)之间肯定存在某种差异,否则,这将是性能方面的巨大倒退。
事实上,当您将对象的类实例传递给函数时,在幕后,真正传递给函数的是指向该类的指针。当然,指针可以按值传递而不会导致性能问题。
其实一切都在按值传递;只是当 你在“传递一个对象”,你实际上是在传递一个引用 对象(并且您正在按值传递该引用)。
一旦我们在函数中,给定参数指针,我们就可以关联通过引用传递的对象。
您实际上不需要为此做任何事情,您可以直接关联作为参数传递的实例(如前所述,整个过程在幕后完成)。
理解到这里,你大概明白空构造函数不会被自动调用,它其实只是指向了原来的对象。
编辑:
至于 out 和 ref,它们允许函数更改参数的值并使该更改在函数范围之外持续存在。
简而言之,对值类型使用 ref 关键字将起到如下作用:
int i = 42;
foo(ref i);
将在 C++ 中翻译成:
int i = 42;
int* ptrI = &i;
foo(ptrI)
省略 ref 将简单地转换为:
int i = 42;
foo(i)
将这些关键字用于引用类型 对象,将允许您将内存重新分配给传递的参数,并使重新分配在函数范围之外持续存在(有关详细信息,请参阅 MSDN page )
旁注:
ref 和 out 的区别在于 out 保证被调用的函数必须给 out 参数赋值,而 ref 没有这个限制,然后你应该自己赋一些默认值来处理,因此, ref 隐含了参数的初始值对函数很重要,可能会影响它的行为。
关于c# - 通过引用与值传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386646/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调