问几个比较简单 但涉及了一些底层运行机制 (主要是编译器修改了小弟我的代码 但小弟我无法理解某些行为)

问几个比较简单 但涉及了一些底层运行机制 (主要是编译器修改了我的代码 但我无法理解某些行为)



.net reflector 8.0.1.308   .net版本设置为none IL中间层的代码实在看不懂




public static int ExecuteNonQuery(string sql, CommandType type = 1, params SqlParameter[] sp)
{
    SqlCommand command;
    int num;
    bool flag;
    command = new SqlCommand();
Label_0007:
    try
    {
        command.Connection = new SqlConnection(constr);
        command.CommandText = sql;
        if ((sp == null) != null)
        {
            goto Label_0038;
        }
        command.Parameters.AddRange(sp);
    Label_0038:
        command.CommandType = type;
        command.Connection.Open();
        num = command.ExecuteNonQuery();
        goto Label_0065;
    }
    finally
    {
    Label_0055:
        if ((command == null) != null)
        {
            goto Label_0064;
        }
        command.Dispose();
    Label_0064:;
    }
Label_0065:
    return num;
}

这个bool flag 有什么作用?  似乎没调用吧 (IL中也可以查看到)



public static DataTable ExecuteDataTable(string sql, CommandType cmdType = 1, params SqlParameter[] sp)
{
    DataTable table;
    SqlDataAdapter adapter;
    DataTable table2;
    bool flag;
    table = new DataTable();
    adapter = new SqlDataAdapter(sql, constr);
Label_0013:
    try
    {
        adapter.SelectCommand.CommandType = cmdType;
        if ((sp == null) != null)
        {
            goto Label_003D;
        }
        adapter.SelectCommand.Parameters.AddRange(sp);
    Label_003D:
        adapter.Fill(table);
        goto Label_0058;
    }
    finally
    {
    Label_0048:
        if ((adapter == null) != null)
        {
            goto Label_0057;
        }
        adapter.Dispose();
    Label_0057:;
    }
Label_0058:
    table2 = table;
Label_005D:
    return table2;
}

 

 table2的用途是什么? 看似很多余.  (IL中也可以查看到)
 


private UserInfoModel CreateModel(DataRow dataRow)
{
    UserInfoModel model;
    UserInfoModel model2;
    UserInfoModel model3;
    model2 = new UserInfoModel();
    model2.Id = Convert.ToInt32(dataRow[0]);
    model2.UserName = dataRow[1].ToString();
    model2.UserPwd = dataRow[2].ToString();
    model2.Email = dataRow[3].ToString();
    model2.RegTime = Convert.ToDateTime(dataRow[4]);
    model = model2;
    model3 = model;
Label_006C:
    return model3;
}

 这个方法中  "多"出了2个model...为什么比上面的还要多出一个?
我写的构造器被拆分了
  


public SqlParameter[] LoadEntity(UserInfoModel uim)
{
    SqlParameter[] parameterArray;
    SqlParameter[] parameterArray2;
    SqlParameter[] parameterArray3;
    parameterArray = new SqlParameter[] { new SqlParameter("@username", uim.UserName), new SqlParameter("@userpwd", uim.UserPwd), new SqlParameter("@email", uim.Email), new SqlParameter("@regtime", (DateTime) uim.RegTime) };
    parameterArray2 = parameterArray;
Label_005F:
    return parameterArray2;
}

 

这个方法中  为什么构造器没被拆分 ?  




我发现我写的很多代码都是被重新了,一部分是为了更高的安全性,还有一分部似乎是为什么编译器去识别优化而特地去写的,比如说上面方法中的using
变成了 try finnal的形式了.Dispose都是自动加上去的.
学的不多,很多东西无法理解,我只能慢慢来了.




为什么编译器可以把true和false定义成1和0? 我们可以么? 
当初学C的时候记得是不可以这么写的  因为规范里没这个定义




 public bool Delete(int id)
        {
            return dal.Delete(id) == 1;
            
        }


 public bool Delete(int id)
        {
            bool flag = dal.Delete(id) == 1;
            return flag;
        }

这两种方法都会在编译后多出一个flag 那么我自己写的时候是不是可以直接return? 这样更"高效"? (我本以为自己定义了flag 然后返回这个flag 编译器就不会再次声明一个flag.事实上,我错了)
------解决思路----------------------
none方式只是为了分析1.0就有的c#语法糖,但是这个方式的反向的c#代码不太适合看,你要看的话还是直接看IL才对。

看到的flag,那是debug方式编译的时候用来临时保存 if 里面布尔逻辑的结果的。如果是release方式编译经过优化就没有这些临时变量了。return返回也是一样的。

using 这是c# 的语法糖,使用 try / finally 使实现了IDisposable接口的对象在出指定代码区域时释放。c#语法糖很多,而且会越来越多。

估值栈上的0和1可以和bool对应这个是CLI标准 ecma-335 III.1.1.1 和 III.1.1.2 定义的。