Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码不在特定方法中单步执行_C# - Fatal编程技术网

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
的code
SearchByName
方法。当它到达:
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