gpt4 book ai didi

c# - 代码不介入具体方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:35 24 4
gpt4 key购买 nike

我有一个奇怪的行为,我在特定位置的代码没有进入特定的方法。没有错误,什么都没有。它只是到达线而没有踏入它。我正在调试并进入每个步骤以发现该问题。我不知道发生了什么,这是我第一次遇到这样的问题。在下面找到我的代码,最后解释了它发生的确切位置。

static class Program
{
private static UnityContainer container;

[STAThread]
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Bootstrap();
Application.Run(container.Resolve<FrmLogin>());
}

private static void Bootstrap()
{
container = new UnityContainer();
container.RegisterType<IRepositoryDal<User>, UserRepositoryDal>();
container.RegisterType<IRepositoryDal<Order>, OrderRepositoryDal>();
container.RegisterType<IDbManager, DbManager>(new InjectionConstructor("sqlserver"));
container.RegisterType<IGenericBal<User>, UserBal>();
container.RegisterType<IGenericBal<Order>, OrderBal>();
}
}

public partial class FrmLogin : Form
{
private readonly IGenericBal<User> _userBal;


public FrmLogin(IGenericBal<User> userBal)
{
InitializeComponent();
_userBal = userBal;
}

private void btnSearch_Click(object sender, EventArgs e)
{
try
{
var a = _userBal.SearchByName("John");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}

public class UserBal : IGenericBal<User>
{
private readonly IRepositoryDal<User> _userRepositoryDal;

public UserBal(IRepositoryDal<User> userRepositoryDal)
{
_userRepositoryDal = userRepositoryDal ?? throw new ArgumentNullException(nameof(userRepositoryDal));
}

public IEnumerable<User> SearchByName(string name)
{
return _userRepositoryDal.SearchByName(name);
}
}

public interface IGenericBal<out T> where T : IEntity
{
IEnumerable<T> SearchByName(string name);
}

public class UserRepositoryDal: IRepositoryDal<User>
{
private readonly IDbManager _dbManager;

public UserRepositoryDal(IDbManager dbManager)
{
_dbManager = dbManager;
}
public IEnumerable<User> SearchByName(string username)
{
var parameters = new List<IDbDataParameter>
{
_dbManager.CreateParameter("@Name", 50, username, DbType.String),
};

username = "JUSTyou";
var userDataTable = _dbManager.GetDataTable("SELECT * FROM T_Marke WHERE Name=@Name", CommandType.Text, parameters.ToArray());

foreach (DataRow dr in userDataTable.Rows)
{
var user = new User
{
Id = int.Parse(dr["Id"].ToString()),
Firstname = dr["Name"].ToString(),
};

yield return user;
}
}
}

public interface IRepositoryDal<T> where T : IEntity
{
IEnumerable<T> SearchByName(string username);
T SearchById(string id);
void Update(T entity);
void Remove(T entity);
void Add(T entity);
}

这里发生的是:

当我开始使用断点进行调试时,我开始单击按钮,这会引发 btnSearch_Click 处理程序,您可以在我的代码中找到它。当它发生时,它转到:var a = _userBal.SearchByName("John"); 然后到 UserBal 的代码 SearchByName 方法。当它到达:return _userRepositoryDal.SearchByName(name); 在这种情况下它不会进入 UserRepositoryDalSerachByName 方法。它只是突出显示这行代码并下一步而不是内部。没有错误,什么都没有...为什么会这样?

最佳答案

这称为“惰性求值”:https://blogs.msdn.microsoft.com/pedram/2007/06/02/lazy-evaluation-in-c/

简而言之,您使用yield return 来返回方法的结果,这意味着代码不会立即得到评估,但实际的方法执行会推迟到您实际使用某些结果评价。

更新:

如果您想立即评估您的代码,您需要以某种方式使用它。最简单的方法是返回整个结果集以从中创建一个新数组或列表。例如,您可以通过替换:

return _userRepositoryDal.SearchByName(name); 

与:

return _userRepositoryDal.SearchByName(name).ToList();

虽然这可能有利于调试,但它也会消除您通过使用惰性求值获得的性能提升。

关于c# - 代码不介入具体方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50873650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com