English 中文(简体)
当你制造了一个在C#中没有任何国家的物体?
原标题:What happens when you create an instance of an object containing no state in C#?
  • 时间:2010-06-14 12:19:40
  •  标签:
  • c#
  • class

我认为,如果这是正确的术语,那是算法方案吗? 我曾于1980年代用涡轮pas和8086只组装语言作为ho。 但是,自那以后,在20年代,只有很小的项目,而且我没有真正做任何方案。 因此,我正竭力争取像一个row水的immer光。

因此,也许这是一个非常棘手的问题,或者说我根本没有意义,但我要说的是:

class Something : IDoer
{
    void Do(ISomethingElse x)
    {
         x.DoWhatEverYouWant(42);
    }
}

当时我这样做了。

var Thing1 = new Something();
var Thing2 = new Something();

Thing1.Do(blah);
Thing2.Do(blah);

...... 图1 图2 新的“某种”会产生什么? 或者,与固定类别相比,这种差异并不大,但我可以绕过这一类别,将其 out掉等等。

Thing1(blah)和Thing2(blah)的同一地点“Do”程序是否反对? 我指的是在执行时,这并不意味着有两点。 程序还是仅仅一个程序?

最佳回答

记忆中最多有两个不同的物体。 每一物体在海绵上将消费8tes(至少在32条轨道系统中);4).和4).(包括方法表)。 除系统界定的国家数据外,在你的案件中没有其他用户界定的国家数据。

<代码>有单一实例。 引文。 Do 方法。 每一物体所持有的哪类处理点是《刑法》如何确定该类别的不同方法。 因此,即使有两种不同的物体,它们还是执行相同的法典。 自Something以来。 Do被宣布为一种实例方法,它将有一个<条码>,即点在内部通过,以便该代码能够根据哪一个物体援引该方法修改正确的审案成员。 在你的情况下,<代码>Something类别没有实例成员(因此没有用户界定的状态),因此这并不相干,但依然发生。

问题回答

它们是两个单独的物体;它们只是没有国家。

考虑这一法典:

var obj1 = new object();
var obj2 = new object();

Console.WriteLine(object.ReferenceEquals(obj1, obj2));

产出<代码>False。

仅仅因为物体没有国家,就意味着它没有像任何其他物体一样得到分配。 仅需要很少的空间(如object)。

回答您的问题的最后一个部分:只有一个<代码>。 Do 方法。 方法并非按例储存,而是按类别储存。 如果你想到这一点的话,将这些问题储存起来将极为浪费。 在<代码>Something上,每一条方法都指向Do的标的,实际上是相同的一套指令;不同物体的呼声之间有差异的都是基本标的状态(如果Something等类别有任何国家可以开始,即)。

这意味着,类物体的典型方法实际上与静态方法相同。

您可能认为,所有审案方法都秘密翻译如下(我不说这严格正确,只是你可以这样认为,这确实是有意义的):

// appears to be instance-specific, so you might think
// it would be stored for every instance
public void Do() {
    Do(this);
}

// is clearly static, so it is much clearer it only needs
// to be stored in one place
private static Do(Something instance) {
    // do whatever Do does
}

有趣的附带说明:上述假设的“翻译”非常确切地解释了推广方法如何运作:它们是静态方法,但其第一参数与<条码>该关键词一样,突然look

无。 它们是<代码>Something的两例。 这一切都是一样的。

你们将创造2个“冒犯”物体,每个物体的肥皂将分配少量。

但是,“Do”方法总是处于同一地位,与没有国家无关。 法典没有储存在课堂/学科。 仅有1部与D(a)相对应的法典,它有一个隐蔽的参数:,该编码指出需要做些什么。

从概念上讲,Thing1和Thing2是不同的物体,但只有一条。 程序。

该网络的运行时间为你制造的每个物体分配了很少的记忆线——一个chu到Thing1,另一个.到Thing2。 这一记忆库的目的是储存(1)物体状态和(2)属于物体的任何程序的地址。 我知道,你没有任何国家,但管理时间没有护理——它仍然另外提到两个单独的记忆库。

现在,你的“Do”方法对Thing1和Thing2来说都是一样的,而操作时间却只保留一种程序版本。

他回忆了分配给Thing1的地址。 当你在Thing1上援引“Do”方法时,研究其地址。 采用图1的方法并使用这种方法。 另一物体Thing2也是如此。 尽管物体不同,但Thing1和Thing2也采用同样的方法。

由此可见,Thing1和Thing2不同,因为“Thing1”和“Thing2”指不同的记忆领域。 在这两种情况下,这种记忆的内容都是一样的——一个标明“Do”方法的单一地址。

即便如此,这一理论也毫无进展。 在任内,可能会有某种选择(见。 http://www.wrox.com/WileyCDA/section/CLR-Method-Call-Internals.id-291453.html。 如果你重新感兴趣的话,但为了最实际的目的,我所说的是工作方式。

Thing1 != Thing2
These are two different objects in memory.

两种物体的两种方法代码相同。 没有必要储存两种不同版本的方法。

每个参考类型(Thing1, Thing2)都指主要记忆中不同的物理地址,因为它们是单独进行的。 记忆中指的是该物体所使用的tes,无论该物体是否具有国家(它总是拥有国家,但是否拥有申报/初始国家)。

如果您指定了另一个参考类型(Thing2 = Thing1);那么,这相当于两种不同参考类型所用的记忆,也不会出现新的瞬时情况。

考虑新建筑者的一个良好办法是,你真的只是把你所领导的班子中唯一负责的方法称作给你一个与你的班子相 cut的新物体。

因此,现在可以有多种情况,即:D

就《刑法》而言,你在记忆中忘记了两例,即每一例都含有点人,这与《刑法》中任何其他语文非常相似,但我们实际上不必与点人互动,因此,它们与非参考类别一样被翻译,因此我们不得不担心他们!

(如果你想勾画你的[安全]关键词,是C#中的点名!)





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签