簡體   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