问几个比较简单 但涉及了一些底层运行机制 (主要是编译器修改了小弟我的代码 但小弟我无法理解某些行为)
问几个比较简单 但涉及了一些底层运行机制 (主要是编译器修改了我的代码 但我无法理解某些行为)
.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 定义的。
.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 定义的。