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

时间:2010-10-11 03:04:51

标签: c# 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中做同样的事情? 请指教。感谢。

4 个答案:

答案 0 :(得分:3)

没有充分的理由在C ++中使用宏;你可以轻松地使它成为一个功能,代码将更清晰:

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

Input也可能作为函数的参数传递,但很难准确说明它的来源。

答案 1 :(得分:2)

你最好在班上创建一个属性

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();
        }
    }
}

答案 2 :(得分:1)

您可以使用枚举

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;
}

但是,所有编辑都将在枚举中,而不是函数。

答案 3 :(得分: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.我想要特别精彩的简洁。)