c# - 在 C# 中创建不包含状态的对象实例时会发生什么?

标签 c# class

我认为我在算法编程方面还不错,如果这是正确的术语?早在 1980 年代,我就曾把玩 turbo pascal 和 8086 汇编语言作为一种爱好。但只有非常小的项目,从那以后的 20 年里我没有真正做过任何编程。所以我像溺水的游泳者一样在努力理解。

所以也许这是一个非常幼稚的问题,或者我根本没有任何意义,但是说我有一个像这样的对象:

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

然后我做

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

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

Thing1 = Thing2 吗? “new Something()”会创造什么吗?或者它与拥有静态类没有太大区别,只是我可以传递它并换掉它等等。

Thing1(blah) 和 Thing2(blah) 对象的“Do”过程是否在内存中的同一位置?我的意思是在执行它时,是否意味着有两个 Something.Do 过程或只有一个?

最佳答案

它们是两个独立的对象;他们只是没有状态。

考虑这段代码:

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

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

它将输出False

仅仅因为一个对象没有状态并不意味着它不会像其他任何对象一样被分配。它只占用很少的空间(就像一个对象)。

针对您问题的最后一部分:只有一种Do 方法。方法不是按实例存储,而是按类存储。如果您考虑一下,按实例存储它们将非常浪费。 Something 对象上对 Do 的每个方法调用实际上都是同一组指令;来自不同对象的调用之间的所有不同之处在于底层对象的状态(如果 Something 类有任何状态开始,那就是)。

这意味着类对象的实例方法实际上在行为上与静态方法相同。

你可能会认为所有实例级方法都被 secret 翻译如下(我并不是说这完全正确,只是你可以这样想并且它确实有点道理):

// 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
}

有趣的旁注:上面假设的“翻译”几乎准确地解释了扩展方法是如何工作的:它们是静态方法,但是通过使用 this 关键字限定它们的第一个参数,它们突然 看起来像实例方法。

关于c# - 在 C# 中创建不包含状态的对象实例时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037124/

相关文章:

c# - 如何获取字段的自定义属性值?

c# - EF Core - 我们可以在包含的项目列表中调用 Include 吗?

java - 类不会计算它应该计算的内容,也是 : sorting arrays of objects?

Javascript Object.prototype 未定义

c# - 阻止 asp :Button OnClick event in C# from the OnClientClick event in JavaScript?

c# - 使用 EF 查询数据不会返回所有实体

c# - 在txt文件中查找并删除整行

java - 将 XML 文件导入 Java 处理时出现 NullPointerException

c++ - 可访问类的私有(private)函数?

C++ - 只有静态成员的类是不好的做法/反模式吗?