所以我看看ILDASM,检查一个如下所示的.exe:
int a = 2;
Int32 b = 1;
if(b == 1)
{
}
Run Code Online (Sandbox Code Playgroud)
现在,CIL代码看起来像这样:
IL_0005: ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2
Run Code Online (Sandbox Code Playgroud)
我知道第一个b被加载(存储在[1]中),然后是一个值为1的常量,然后进行比较.我不明白的是为什么在存储比较结果之前加载并比较另一个值为0的常量.
由于第一次比较应该已经产生了一个真值,检查这个值是否为0会反转结果,对吧?
我现在的问题是:它为什么倒置了?我假设它与我使用的==运算符有关,我的理论是它返回差异.如果此差值为0,则值相同,因此应该是结果.但0表示错误,因此需要反转.
我似乎无法找到关于这个主题的任何内容,只是关于像==〜或类似的运算符.希望你能赐教:)
最好的祝福
Wilsu
PS:这是完整的代码:
.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]
System.EventArgs e) cil managed
{
// Code size 19 (0x13)
.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: stloc.0
IL_0003: ldc.i4.1
IL_0004: stloc.1
IL_0005: ldloc.1
IL_0006: ldc.i4.1 …Run Code Online (Sandbox Code Playgroud) 比方说,我有一个对象MyCharacter类Character,它具有以下特性:Health,Mana,MoveSpeed.
从另一种方法我得到一个包含这些统计数据的字符串如下:
"Health: 100 Mana: 100 MoveSpeed: 100"
我现在想要将这些统计数据分配给我的对象.我目前的尝试是这样的:
// stats is the string I showed above
var statsArray = stats.Split(' ');
for (var i = 0; i < statsArray.Length; i++)
{
switch(statsArray[i])
{
default:
break;
case "Health:":
MyCharacter.Health = statsArray[i+1];
break;
case "Mana:":
MyCharacter.Mana = statsArray[i+1];
break;
case "MoveSpeed:":
MyCharacter.MoveSpeed = statsArray[i+1];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
现在的事情是,我知道统计数据的顺序.它总是健康,然后是Mana,然后是MoveSpeed.所以我正在寻找一种简化它的方法,即摆脱它switch(因为实际的Character这里有18个统计数据并且它看起来不是很好看).
我的想法是通过数组并告诉程序将它找到的第一个数字分配给Health,第二个分配给Mana,第三个分配给MoveSpeed.
有甚么可能吗?
我目前正在开发一个使用不同部门的程序集的软件。
我从这样的程序集中调用方法:
using (var connection = (IConnection) Factory.GetObject(typeof (IConnection)))
Run Code Online (Sandbox Code Playgroud)
该代码过去可以正常工作。但是在最后几分钟,当我尝试启动它时,我的程序似乎无能为力。在调试时按暂停显示我在上面的行中被“卡住了”。
我的猜测是他们只是在做一些维护或其他事情,但这不是重点。
因此,我很高兴告诉用户如果程序无法启动又出了什么问题。简单的东西
MessageBox.Show("Could not connect", "Connection Error");
Run Code Online (Sandbox Code Playgroud)
然后关闭程序。我的问题是:
如何在设定的时间后终止命令的执行并跳到其他地方?
我的猜测是将其移动到单独的线程中,然后将调用线程置于休眠状态几秒钟,之后,如果尚未完成,它将处理多余的线程。但这对我来说确实很脏,必须有一种更好的方法。
我目前正在编写一个应用程序,它建立与某种服务的连接,以一些DataTable对象的形式获取数据,然后应该向用户显示它.
为了存储数据,我得到我做了一个叫做类DataStorage具有List<DataTable>.其他类需要能够编辑此List,例如添加所需的对象或在用户发现不需要时删除它们.如果我需要一组全新的数据,我还必须能够清除它.
我可以DataStorage为此提供方法,但由于List<T>已经提供了这些,我认为没有必要像这样封装它.所以我这样做是readonly为了确保没有人试图分配一个新对象 - 甚至更糟糕的是null- 并制作了访问修饰符public.
这种设计是否可以接受,或者我应该始终保护字段免受直接访问,无论如何?
所以我有一些如下所示的 C# 代码:
while(condition)
{
switch(anumber)
{
case 0:
//do something
break;
case 1:
//do something
break;
//and so on
}
}
Run Code Online (Sandbox Code Playgroud)
作为一名编程新手,我最近将关键字添加到continue了我的词汇表中。经过一些研究后,我发现了这一点:
continue 语句与封闭循环相关
所以我的代码也应该像这样工作:
while(condition)
{
switch(anumber)
{
case 0:
//do something
continue;
//and so on
}
}
Run Code Online (Sandbox Code Playgroud)
但编写不产生编译器错误的代码并不是一切。continue在循环封闭的开关块中使用是一个好主意吗?例如,在性能方面是否有任何差异,或者这只是两种语法上不同但在其他方面非常相似的方法来实现相同的结果?