繁体   English   中英

#define-将C ++迁移到C#或VB.Net

[英]#define - Migrating C++ to C# or VB.Net

我需要一些有关如何在C#和VB.net中执行以下操作的建议。

在C ++中,在头文件中执行以下操作:

#define  StartButtonPressed  Input[0]==1 // Input is an array declared in .cpp file

在我的.cpp文件中,我有类似以下的代码:

if(StartButtonPressed)
    // do something

我这样做的原因是为了使我的代码更易于阅读。 我在C#中尝试了相同的操作,但出现错误。 如何在C#和VB.Net中做同样的事情? 请指教。 谢谢。

没有充分的理由在C ++中为此使用宏。 您可以轻松地使其成为函数,并且代码将更加简洁:

bool IsStartButtonPressed()
{
    return Input[0] == 1;
}

Input也可能应该作为参数传递给函数,但是很难确切说明输入的来源。

最好在课堂上创建媒体资源

protected bool StartButtonPressed {
   get { return Input[0] == 1; }
}

那么你的代码可以像以前一样

.
.
.
if(StartButtonPressed) {

.
.
.
}

但是为了与.net框架保持一致,我建议调用属性IsStartButtonPressed

如果您需要在if语句的位置进行求值,那么您确实需要一个函数或属性。 但是,这是一次评估,您可以使用一个字段

bool isStartButtonPressed = Input[0] ==1;

如果您希望类具有此功能,那么我建议您从另一个类中推荐一个静态函数,例如

public static class ButtonChecker {
        public static bool IsPressed(int[] input) {
            return input[0] == 1;
        }
    }

然后用

if(ButtonChecker.IsPressed(Input)) {
  .
  .
}

但是最终您不能像在C / C ++中那样使用宏。 您不必担心这样的属性和函数的性能,因为CLR jit编译器实现对它们非常有用

这是一个示例程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace ConsoleApplication1 {

    public static class ButtonChecker {
        public static bool IsPressed(int[] input) {
            return input[0] == 1;
        }
    }

    static class Program {

        public static void Main(){
            int[] Input = new int[6] { 1, 0, 2, 3,4 , 1 };

            for(int i = 0; i < Input.Length; ++i){
                Console.WriteLine("{0} Is Pressed = {1}", i, ButtonChecker.IsPressed(Input));
            }
            Console.ReadKey();
        }
    }
}

您可以使用一个枚举

public enum buttonCode
{
   startButton = 0,
   stopButton = 1
   // more button definitions
}  

然后也许一个功能

public bool IsButtonPressed(b as buttoncode)
{
return Input[b] == 1;
}

然后您的呼叫如下所示:

if IsButtonPressed(buttonCode.StartButton) {   }

这样,切换按钮代码所需的唯一更改就在枚举中,而不是分散在多个功能上。

编辑添加:

如果要使用单独命名的函数,可以执行以下操作:

public bool IsStartButtonPressed()
{
return Input[buttonCode.StartButton] == 1;
}

尽管如此,所有编辑都将在枚举中,而不是函数中。

Bjarne Stroustrup写道:

关于宏的第一条规则是:不必使用它们。 几乎每个宏都表明编程语言,程序或程序员中的缺陷。

在说其他任何事情之前,这里需要注意两件事。 首先,在某些其他语言中,“宏”的含义可能完全不同。 人们不会对Lisp发表相同的说法。 第二个原因是Stroustrup愿意承担责任,他说使用宏的一个原因是“编程语言中的缺陷”,所以这并不意味着他只是在谴责使用宏方面表现出色。

这种情况虽然不是编程语言中的缺陷,但它首先允许您使用它(但必须允许其他宏)。 该宏的唯一目的是使代码更难阅读。 摆脱它。 将其替换为一些实际的C#代码,例如:

private bool StartButtonPressed
{
  get
  {
    return Input[0]==1
  }
}

编辑:

看到上面有关希望更快地编写代码的评论,我将执行以下操作:

private enum Buttons
{
  Start = 0,
  Stop = 1,
  Pause = 2,
  /* ... */
}

private bool IsPressed(Buttons button)
{
  return Input[(int)button] == 1;
}

然后调用例如IsPressed(Buttons.Start) 然后,我也将C ++修复为也使用相同的方法(在C ++中,我什至Buttons.在我想要特别简洁的地方)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM