C# 代码不在特定方法中单步执行
我有一种奇怪的行为,我在特定位置的代码并没有进入特定的方法。没有错误,什么都没有。它只是到达终点线而没有进入终点线。我正在调试并进入每个步骤以发现问题。我不知道发生了什么,这是我第一次面对这样的问题。下面找到我的代码,并在最后解释了它发生的确切位置C# 代码不在特定方法中单步执行,c#,C#,我有一种奇怪的行为,我在特定位置的代码并没有进入特定的方法。没有错误,什么都没有。它只是到达终点线而没有进入终点线。我正在调试并进入每个步骤以发现问题。我不知道发生了什么,这是我第一次面对这样的问题。下面找到我的代码,并在最后解释了它发生的确切位置 static class Program { private static UnityContainer container; [STAThread] private static void Main() {
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);
}
静态类程序
{
私有静态UnityContainer容器;
[状态线程]
私有静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Bootstrap();
Application.Run(container.Resolve());
}
私有静态无效引导()
{
容器=新的UnityContainer();
container.RegisterType();
container.RegisterType();
RegisterType(新注入构造函数(“sqlserver”);
container.RegisterType();
container.RegisterType();
}
}
公共部分类FrmLogin:表单
{
私有只读IGenericBal(用户bal);
公共FrmLogin(IGenericBal userBal)
{
初始化组件();
_userBal=userBal;
}
私有无效btnSearch_单击(对象发送者,事件参数e)
{
尝试
{
变量a=_userBal.SearchByName(“John”);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
}
}
公共类UserBal:IGenericBal
{
私有只读IRepositoryDal _userRepositoryDal;
public UserBal(IRepositoryDal userRepositoryDal)
{
_userRepositoryDal=userRepositoryDal??抛出新的ArgumentNullException(nameof(userRepositoryDal));
}
公共IEnumerable SearchByName(字符串名称)
{
返回_userRepositoryDal.SearchByName(名称);
}
}
公共接口IGenericBal,其中T:Entity
{
IEnumerable SearchByName(字符串名称);
}
公共类UserRepositoryDal:IRepositoryDal
{
专用只读IDbManager _dbManager;
公共用户RepositoryDal(IDbManager dbManager)
{
_dbManager=dbManager;
}
公共IEnumerable SearchByName(字符串用户名)
{
var参数=新列表
{
_dbManager.CreateParameter(“@Name”,50,用户名,DbType.String),
};
username=“JUSTyou”;
var userDataTable=_dbManager.GetDataTable(“从T_Marke中选择*,其中Name=@Name”,CommandType.Text,parameters.ToArray());
foreach(userDataTable.Rows中的DataRow dr)
{
var user=新用户
{
Id=int.Parse(dr[“Id”].ToString()),
Firstname=dr[“Name”].ToString(),
};
用户收益率;
}
}
}
公共接口IRepositoryDal,其中T:IEntity
{
IEnumerable SearchByName(字符串用户名);
T SearchById(字符串id);
无效更新(T实体);
无效删除(T实体);
无效添加(T实体);
}
这里发生的是:
当我开始使用断点进行调试时,我开始单击按钮,该按钮会引发btnSearch\u单击您可以在我的代码中找到的处理程序。当它发生时,它会转到:var a=\u userBal.SearchByName(“John”)
然后转到UserBal
的codeSearchByName
方法。当它到达:return\u userRepositoryDal.SearchByName(name)
在本例中,它不进入UserRepositoryDal
的SerachByName
方法。只需突出显示这一行代码,然后进入下一行,但不要进入内部。没有错误,什么都没有。。。为什么会发生这种情况?这被称为“惰性评估”:
简而言之,您可以使用yield return
返回方法的结果,这意味着代码不会立即得到计算,但实际的方法执行会推迟到,直到您实际使用一些计算结果为止
更新:
如果您想立即评估代码,您需要以某种方式使用它。最简单的方法是返回整个结果集以从中创建新数组或列表。例如,您可以通过替换:
return _userRepositoryDal.SearchByName(name);
与:
虽然这可能有助于调试,但它也会消除通过使用惰性评估获得的性能增益。这称为“惰性评估”:
简而言之,您可以使用yield return
返回方法的结果,这意味着代码不会立即得到计算,但实际的方法执行会推迟到,直到您实际使用一些计算结果为止
更新:
如果您想立即评估代码,您需要以某种方式使用它。最简单的方法是返回整个结果集以从中创建新数组或列表。例如,您可以通过替换:
return _userRepositoryDal.SearchByName(name);
与:
虽然这可能有助于调试,但它也会删除通过使用惰性计算获得的性能增益。这段代码是惰性枚举:
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 IEnumerable<User> SearchByName(string username)
{
List<User> response = new List<User>();
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(),
};
//Add to a collection
response.Add(user);
}
//return result
return response;
}
public IEnumerable SearchByName(字符串用户名)
{
列表响应=新列表();
var参数=新列表
{
_dbManager.CreateParameter(“@Name”,50,用户名,DbType.String),
};
username=“JUSTyou”;
var userDataTable=_dbManager.GetDataTable(“从T_Marke中选择*,其中Name=@Name”,CommandType.Text,parameters.ToArray());
foreach(userDataTable.Rows中的DataRow dr)
{
var user=新用户
{
Id=int.Parse(dr[“Id”].ToString()),
Firstname=dr[“Name”].ToString(),
};
//添加到集合中
添加(用户);
}
//返回结果
返回响应;
}
这段代码是一个惰性枚举:
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 IEnumerable<User> SearchByName(string username)
{
List<User> response = new List<User>();
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(),
};
//Add to a collection
response.Add(user);
}
//return result
return response;
}
公共IEnumerable