C
C#5mo ago
ekhidna

Confusing code with keyword ref

I am refactoring an old code base and I stumbled on this:
public interface IBaseRepository<TEntity> {
bool InsertNanoEntity(TEntity entity, string login = null);
bool InsertNanoEntity(TEntity entity, ref AuditDto audit, string login = null);
}

public abstract class BaseRepository<TEntity> : IDisposable, IBaseRepository<TEntity> where TEntity : NanoBaseEntity {

public bool InsertNanoEntity(TEntity entity, string login = null) {
AuditDto audit = null;
return this.InsertNanoEntity(entity, ref audit, login);
}

public bool InsertNanoEntity(TEntity entity, ref AuditDto audit, string login = null) {

if (this.LoggedUser != null) {
entity.SiteId = this.LoggedUser.GetUserSessionSiteId;
}

entity.ModifiedDate = DateTime.Now;
EntityEntry dbEntity = this._context.Entry(entity);
dbEntity.State = EntityState.Added;

if (audit != null) {
audit.AuditList.AddRange(this.CreateAuditTrace(dbEntity, AuditTypeEnumDto.Create));
}
bool success = this._context.SaveChanges() != 0;
return success;
}
public interface IBaseRepository<TEntity> {
bool InsertNanoEntity(TEntity entity, string login = null);
bool InsertNanoEntity(TEntity entity, ref AuditDto audit, string login = null);
}

public abstract class BaseRepository<TEntity> : IDisposable, IBaseRepository<TEntity> where TEntity : NanoBaseEntity {

public bool InsertNanoEntity(TEntity entity, string login = null) {
AuditDto audit = null;
return this.InsertNanoEntity(entity, ref audit, login);
}

public bool InsertNanoEntity(TEntity entity, ref AuditDto audit, string login = null) {

if (this.LoggedUser != null) {
entity.SiteId = this.LoggedUser.GetUserSessionSiteId;
}

entity.ModifiedDate = DateTime.Now;
EntityEntry dbEntity = this._context.Entry(entity);
dbEntity.State = EntityState.Added;

if (audit != null) {
audit.AuditList.AddRange(this.CreateAuditTrace(dbEntity, AuditTypeEnumDto.Create));
}
bool success = this._context.SaveChanges() != 0;
return success;
}
Problem number 1. The 2nd method it's called only by the 1st one. So I can remove it from interface, and make it private. But my great doubt is with the ref AuditDto audit parameter. Before being called there's always that code line: AuditDto audit = null; Can I safely remove the ref AuditDto audit parameter and convert the method to Async? Or because it's a parameter called by reference it will change audit status and I should not do that. I understand that calling by reference will change the object status outside the method. My problem is that before being called it is always set to null. So my final question is can I make something like:
public async Task<bool> InsertNanoEntityAsync(TEntity entity, string login = null) {
....
}
public async Task<bool> InsertNanoEntityAsync(TEntity entity, string login = null) {
....
}
Or, besides being called always as null, should I still worry with audit ? Thank you !!!
7 Replies
ekhidna
ekhidnaOP5mo ago
Maybe I did not explain very well. Making the 2nd method private is only an observation. The entire question is changing it to Async, and if ref Audit is really needed as it's always null
333fred
333fred5mo ago
Usually a ref parameter like this means that the body will actually initialize it Usually If you're confident that audit is never getting assigned by any implementation of IBaseRepository, then it could be fine to remove
Omnissiah
Omnissiah5mo ago
but ref is kinda wrong there, it should be out
333fred
333fred5mo ago
Kinda It's weird that's a ref at all
Omnissiah
Omnissiah5mo ago
no yeah audit contains something
333fred
333fred5mo ago
But maybe a different implementation initializes it?
Omnissiah
Omnissiah5mo ago
yes, ref has not effect here to me if a different implementation used audit then this implementation should check audit.AuditList != null
Want results from more Discord servers?
Add your server