小编Cbs*_*sch的帖子

如何在.NET中抑制打印到控制台的按键?

我正在将一个小型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)

但这并不能抑制字符被打印到控制台,从而导致明显的问题.关于如何解决这个问题的任何想法?

.net c# console

16
推荐指数
2
解决办法
9378
查看次数

C到汇编调用约定32位对64位

我一直在关注优秀的编程基础,希望学习装配.虽然现在不在书中,但是我想在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位堆栈上传递参数?这非常令人困惑!在任何地方我都找不到任何提及.有没有人可以在这种情况下启发我?

c linux x86 assembly x86-64

10
推荐指数
1
解决办法
1万
查看次数

JsonSerializer.Serialize 只序列化基类的属性

我想要一个基类,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)

c# .net-core

6
推荐指数
1
解决办法
4355
查看次数

在覆盖虚拟属性时如何避免无限循环?

当我分配或检索值时,是否可以忽略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中的代码的情况下设置或获取值,或者我是否必须为实际变量创建单独的名称?

.net c#

2
推荐指数
1
解决办法
563
查看次数

标签 统计

c# ×3

.net ×2

.net-core ×1

assembly ×1

c ×1

console ×1

linux ×1

x86 ×1

x86-64 ×1