Tag: object lifetime

将一个对象的方法传递给另一个对象是否保持第一个对象存活?

假设我有三个对象:’a’,’b’和’c’。 对象’a’和’c’是长寿命的,静态引用的服务单例。 对象’b’是短暂的,即没有静态引用使其保持活动状态。 现在假设对象’a’在其一个方法的范围内创建对象’b’的实例,例如 B b = new B(); 进一步假设B类看起来像这样: public B () { C.ActionList.Add ( SomeMethod ); } void SomeMethod () { … } 现在,对象’b’存活了多长时间? 我的推测是,它超出了调用其构造函数的方法的范围; 具体来说,只要它的方法仍然在对象’c’的’ActionList’中。 那是对的吗? 如果没有,它会被垃圾收集,当’c’运行’ActionList’中的所有方法时会发生什么? 额外的问题:如果’b’上的方法没有命名,但匿名并在构造函数中写入如下,该怎么办? public B () { C.ActionList.Add ( () => { … } ); }

我可以重写Dispose来创建一个总是调用SaveChanges的实体类吗?

这是一个相当好的观点,我希望答案是“开始时并不是一个好主意” – 也就是说,如果某人有点放纵,它有一个我感兴趣的点。 型号代码: public partial class MyEntities : ObjectContext { // the idea is if the object is in a using block, this always gets called? protected override void Dispose(bool disposing) { this.SaveChanges(); base.Dispose(disposing); } } 客户代码: using(var model = new MyEntities()) { // do something // no worry about calling model.SaveChanges() } 我不确定的问题是: […]

谁拥有.NET中的包裹流(例如TextWriter)?

我最近遇到一个错误“ObjectDisposedException:无法访问已关闭的流” [ObjectDisposedException: Cannot access a closed Stream.] System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) +10184402 System.Security.Cryptography.CryptoStream.FlushFinalBlock() +114 System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) +48 使用以下格式的代码时: using (var stream = new MemoryStream()) { using (var hashStream = new CryptoStream(stream, new SHA256Managed(), CryptoStreamMode.Write)) using (var writer = new TextWriter(hashStream)) { writer.Write(“something”); } // ^– Exception occurs on hashStream Dispose // While naively […]

在匿名代表中捕获的私有字段

class A { public event EventHandler AEvent; } class B { private A _foo; private int _bar; public void AttachToAEvent() { _foo.AEvent += delegate() { … UseBar(_bar); … } } } 由于委托捕获变量this._bar,它是否隐式持有B的实例? 将B的实例通过事件处理程序引用并通过A的实例捕获变量吗? 如果_bar是AttachToAEvent方法的局部变量,它会有所不同吗? 因为在我的情况下,A的实例寿命更长并且远小于B的实例,所以我担心通过这样做会导致“内存泄漏”。

为可变范围目的使用大括号是错误的吗?

我有时会使用大括号来隔离代码块,以避免以后错误地使用变量。 例如,当我在同一个方法中放入几个SqlCommand时,我经常复制粘贴代码块,最后混合名称并执行两次命令。 添加大括号有助于避免这种情况,因为在错误的位置使用错误的SqlCommand将导致错误。 这是一个例子: Collection existingCategories = new Collection(); // Here a beginning of a block { SqlCommand getCategories = new SqlCommand(“select Title from Movie.Category where SourceId = @sourceId”, sqlConnection, sqlTransaction); getCategories.Parameters.AddWithValue(“@sourceId”, sourceId); using (SqlDataReader categoriesReader = getCategories.ExecuteReader(System.Data.CommandBehavior.SingleResult)) { while (categoriesReader.Read()) { existingCategories.Add(categoriesReader[“Title”].ToString()); } } } if (!existingCategories.Contains(newCategory)) { SqlCommand addCategory = new SqlCommand(“insert into […]

.NET – 终结器和退出(0)

我有一个.NET C#/ C ++应用程序,它使用一个线程中的exit(0) (来自 )来终止。 奇怪的是,在某些情况下,托管对象的终结器在调用exit后立即被调用,而在其他情况下,它们根本不被调用。 这种情况非常确定 – 应用程序在其生命周期内从外部插件dll(用非托管C编写)调用一些方法。 如果我使用dll A,则始终调用终结器。 如果我使用dll B,则永远不会调用终结器。 在退出(0)调用的情况下,终结器的预期行为是什么? (如果有任何预期的和记录在案的行为) 对外部dll的调用是否会改变一些可能影响进程终止方式的全局设置?

为什么在using语句中声明的变量被视为readonly?

为什么using变量作为只读处理? 它是c#语言规范还是托管语言规范? 这是因为c#是.net语言? 提前致谢。 注意 :using变量是在using语句中出现的变量 示例代码: using (Form s = new Form) { myfunc(ref s); } 我们不能在使用块中更改using变量的值。 代码会引发错误。 注意 :我不想让你讨论readonly关键字。

ISponsor和ILease接口如何工作?

我创建了一个inheritanceMarshalByRefObject和ISponsor的对象。 在我的ISponsor实现中,我只返回一个时间跨度来指示我想要更新对象的时间。 当我调用InitializeLifetimeService()来获取要传递到我的ISponsor对象的ILease引用时,它似乎永远不会在我看到的示例中使用。 ISponsor似乎只是在没有实际使用ILease引用的情况下返回TimeSpan。 但我确信这里有更多的事情,因为涉及远程处理。 ISponsor和ILease如何工作,特别是在对象生命周期更新方面?