我正在将一个小型C++控制台游戏移植到C#,似乎我无法阻止按键被打印到控制台.
在C++中,我使用此方法获得击键,这也可以抑制击键被打印到控制台:
bool Game::getInput(char *c)
{
if (_kbhit())
{
*c = _getch();
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我尝试通过以下方式在C#中执行等效操作:
Key = Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
但这并不能抑制字符被打印到控制台,从而导致明显的问题.关于如何解决这个问题的任何想法?
我一直在关注优秀的编程基础,希望学习装配.虽然现在不在书中,但是我想在32位机器上调用我的汇编函数,这在本书的工作中是有效的.
我在这里做的是存储第一个参数%ebx和第二个参数%ecx.
.type power, @function
.globl power
power:
pushq %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
Run Code Online (Sandbox Code Playgroud)
我将这个(以及函数的其余部分)编译成一个目标文件,创建一个main.c,在那里我对函数进行原型化并调用它,如下所示:
int power(int b, int x);
int a = power(2, 1);
Run Code Online (Sandbox Code Playgroud)
但是,当我在64位机器上编译它时,我得到一些非常意外的结果.我修改了明显的,喜欢的事实,%esp并%epb需要更换与%rsp和%rpb,但与GDB挖掘显示,参数是无处栈上找到!
通过使用-SGCC选项检查发生了什么我可以看到,GCC不是在堆栈上推送变量,而是将参数存储在寄存器中.
movl $1, %esi
movl $2, %edi
call power
Run Code Online (Sandbox Code Playgroud)
在32位机器上,它完成我所期望的并推送堆栈上的参数:
movl $1, 4(%esp)
movl $2, (%esp)
call power
Run Code Online (Sandbox Code Playgroud)
现在发生了什么事?为什么GCC在64位寄存器和32位堆栈上传递参数?这非常令人困惑!在任何地方我都找不到任何提及.有没有人可以在这种情况下启发我?
我想要一个基类,ToString通过将继承它的任何对象转换为 JSON 来覆盖。运行该程序时,似乎this在上下文中基础对象不是完整的对象,而只是基础对象本身。
是否可以从基础对象引用继承的对象?
using System;
using System.Text.Json;
namespace Test
{
public class BaseModel
{
public override string ToString()
{
return JsonSerializer.Serialize(this);
}
}
public class Data : BaseModel
{
public string Name { get; set; }
public int Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
var data = new Data { Name = "Test", Value = 42 };
Console.WriteLine(data);
}
}
}
Run Code Online (Sandbox Code Playgroud) 当我分配或检索值时,是否可以忽略set和get?
具体来说,我从一个具有如下声明属性的类继承:
virtual public Int32 Value { get; set; }
Run Code Online (Sandbox Code Playgroud)
我想要做的是覆盖它并在那些集合和get中做一些有用的事情.当我覆盖它时出现问题,我还必须手动分配,或从属性返回值.如果我做这样的事情:
override public Int32 Value
{
get
{
return this.Value;
}
set
{
this.Value = value;
// do something useful
}
Run Code Online (Sandbox Code Playgroud)
然后我正在创建一个无限循环.有没有办法在不调用set和get中的代码的情况下设置或获取值,或者我是否必须为实际变量创建单独的名称?