对象重用如何在.NET中工作?

时间:2009-01-09 13:06:22

标签: .net oop

我最近从VB6迁移到了VB.NET,我终于了解了内部工作原理。我一直在看我公司现有的代码库,我有点惊讶。

据我所知,当VB.NET创建一个字符串时,它会看到字符串是否在内存中,如果没有,则创建该字符串的新实例,否则它将新变量指向旧的。不过我想知道它是否与其他物体一起使用?

我问的原因是我的新公司有一个DATABASE对象,它基本上包装对象中的数据库连接信息和数据库连接。

我们还有一个BOOK对象和一个PAGES对象。

我在VB6中的最佳实践是创建一个DATABASE对象,然后将(byRef)传递给BOOK,然后传递给PAGES对象,这样就可以将一个DATABASE对象传递给多个书籍,然后传递给PAGES。

然而,他们是如何做到的是在每个PAGE和每个PAGE对象中创建一个DATABASE对象的新实例,这意味着你可以拥有多个实例(实际上是数千个)的对象实际上都是一样的。

这是明智的吗?或者像Strings一样处理对象?

3 个答案:

答案 0 :(得分:5)

您对字符串的理解仅适用于字符串常量 - 而不是以任何其他方式创建的字符串。

如果成千上万的数据库对象都“相同”,那么听起来他们实际上应该将引用传递给同一个对象。您需要了解the difference between a reference and an object

最后,代码中的任何内容都不应该保留在连接上。打开连接几乎总是更好,做你需要的任何事情,然后再关闭它。连接池系统可以确保重用与数据库的真实连接(创建成本相对较高)。

答案 1 :(得分:2)

使用特殊情况作为其他对象处理字符串。当其他对象卡在堆上时(更详细here),它们被实习(说明在备注部分http://msdn.microsoft.com/en-us/library/system.string.isinterned(VS.80).aspx中。

最好通过尽可能晚地创建连接并尽快关闭它来处理数据库连接。虽然传递连接信息可能没问题,但您不应该传递实际的连接。

答案 2 :(得分:1)

第一个:字符串是一个作为值类型处理的对象(因为这是您期望的行为),这意味着无论何时执行赋值/操作(如连接,替换,...​​), value被复制到字符串类的新实例中。例如: string t =“hallo”; t = t +“你”; 包含3个不同的字符串实例,包含:“hallo”,“you”和“hallo you”;

关于数据库对象...看看ORM映射器(我个人使用亚音速) 大多数时候他们使用以下分隔:   - 管理与数据库的连接的数据库对象(就像您一样)   - 包含使用数据库对象为每个对象加载/检索,更新,删除(SCUM操作)的逻辑的控制器或适配器。   - 包含数据的对象(例如书籍对象)

所以现在你有1个数据库对象(可以包含多个连接,但通常不会这样做......) 一个控制器类,用于创建数据(或域对象,具体取决于您如何定义这些),更新或删除数据。 以及您使用的不同数据(/域)对象的许多实例......