C# 创建对现有对象的引用时是否调用?

C# 创建对现有对象的引用时是否调用?,c#,dispose,C#,Dispose,我有一个类,其中有一个方法执行一些数据库操作。 我希望允许在用于数据库访问的方法调用中发送现有的开放上下文。 但是,如果未发送上下文,我将创建一个新上下文 我只想确保如果对象包含在方法调用中,则不会释放该对象 当在被调用的方法中使用使用范围时,对象是否被释放 // DbService class class DbService { private void SomeDbAction(SomeDbContextObject backendContext = null) {

我有一个类,其中有一个方法执行一些数据库操作。 我希望允许在用于数据库访问的方法调用中发送现有的开放上下文。 但是,如果未发送上下文,我将创建一个新上下文

我只想确保如果对象包含在方法调用中,则不会释放该对象

当在被调用的方法中使用使用范围时,对象是否被释放

// DbService class
class DbService
{
    private void SomeDbAction(SomeDbContextObject backendContext = null)
    {
        using (var context = backendContext ?? CreateNewContextObject())
        {
            // Some actions using the context
        }
    }
}


// Call from another class
class Temp
{
    void DoSomeThing()
    {
        var existingContext = new SomeDbContextObject();
        dbService.SomeDbAction(existingContext);
        // Is dbService disposed here?
        UseContextForSomethingElse(existingContext);
    }
}
是的,已经处理好了。在这种情况下,可选参数对您不利-最好有两个特定的重载:

class DbService
{
    public void SomeDbAction(SomeDbContextObject backendContext)
    {

            // Some actions using the context

    }
    public void SomeDbAction()
    {
        using (var context = CreateNewContextObject())
        {
            SomeDbAction(context);
        }
    }
}
是的,已经处理好了。在这种情况下,可选参数对您不利-最好有两个特定的重载:

class DbService
{
    public void SomeDbAction(SomeDbContextObject backendContext)
    {

            // Some actions using the context

    }
    public void SomeDbAction()
    {
        using (var context = CreateNewContextObject())
        {
            SomeDbAction(context);
        }
    }
}
如果已传入backendContext对象,则不应处置该对象,但如果在以下方法中创建了该对象,则应处置该对象:

private void CoreSomeDbAction(SomeDbContextObject backendContext) {
  //TODO: Some actions using the context
}

private void SomeDbAction(SomeDbContextObject backendContext = null) {
  if (null == backendContext) {
    // created context should be disposed
    using (SomeDbContextObject context = new SomeDbContextObject(...)) {
      CoreSomeDbAction(context); 
    }
  }
  else 
    CoreSomeDbAction(backendContext); // passed context should be prevent intact
}
如果已传入backendContext对象,则不应处置该对象,但如果在以下方法中创建了该对象,则应处置该对象:

private void CoreSomeDbAction(SomeDbContextObject backendContext) {
  //TODO: Some actions using the context
}

private void SomeDbAction(SomeDbContextObject backendContext = null) {
  if (null == backendContext) {
    // created context should be disposed
    using (SomeDbContextObject context = new SomeDbContextObject(...)) {
      CoreSomeDbAction(context); 
    }
  }
  else 
    CoreSomeDbAction(backendContext); // passed context should be prevent intact
}

dbService在这里部署吗?是的,保留using语句会帮您解决这个问题。using calls Dispose。如果不希望调用Dispose,请不要使用using语句。当到达using语句的右括号时,将调用Dispose,因为您不希望自动处理,只需删除using语句并使用现有上下文手动执行。准备在此处处置dbService时,是否进行Dispose?是的,保留using语句会帮您解决这个问题。using calls Dispose。如果不希望调用Dispose,请不要使用using语句。当到达using语句的右括号时,将调用Dispose,因为您不希望自动处理,只需删除using语句并使用现有上下文手动执行即可。准备好后进行Dispose