调用#if内部的函数

时间:2019-05-01 00:40:29

标签: c#

我正试图调用两个函数ShowInventories和DoTransaction。这两个函数都在“ #if”中。我不确定'#if'是什么意思,或者是否有指定方法可以从中调用函数。

我只是试图调用ShowInventories和DoTransaction函数,然后像这样通过它们运行我需要执行的操作:

ShowInventories(Thing being sent through);

DoTransaction(Thing being sent through);

#if语句如下:

#if INVENTORY
static void ShowInventories(string playerName, Inventory playerInv, Inventory storeInv)
{
    Console.SetCursorPosition(2, 2);
    Console.Write(playerName + "'s inventory: ");
    playerInv.DisplayInventory(4, 3);

    Console.SetCursorPosition(39, 2);
    Console.Write("The Store's inventory: ");
    storeInv.DisplayInventory(41, 3);
}

static void DoTransaction(string playerName, Inventory playerInv, Inventory storeInv, bool buy)
{
    if (buy)
    {
        DoBuy(playerName, playerInv, storeInv);
    }
    else
    {
        DoSell(playerName, playerInv, storeInv);
    }
}
...
#endif

我不知道两个函数中的代码是否重要,但是我以两种方式都将它们放入。他们正在代码中的其他位置调用其他函数,但我不确定要包含它是否重要。

问题在于,它告诉我“即使在当前上下文中这两个函数都不存在”,即使通过该代码下面的“ #if”也是如此。我也不明白“ #if”是什么,如果有人可以帮我解决问题,我将非常感激。谢谢你。

2 个答案:

答案 0 :(得分:2)

#if是我们所谓的预处理程序指令。这就是说,在编译代码时,编译器将仅包含内部内容

 #if DEBUG
  .....
 #endif

在您的项目中声明了属性DEBUG时(例如,如果它处于DEBUG模式,通常会使用该属性)。

所以在您的代码中您拥有

 #if INVENTORY
     static void ShowInventories(string playerName, Inventory playerInv, Inventory storeInv)
     {
     ......
     }
 #endif

但是由于您的项目属性未声明INVENTORY,因此#if中的代码未包括在内,编译器无法找到方法。

答案 1 :(得分:2)

这听起来像preprocessor directive#if#endif之间包含的代码只有在声明了相关符号的情况下才会编译。对于各种构建配置,将声明不同的符号。

通常仅在“调试”构建配置中声明DEBUG符号,而不在“发布”配置中声明。这样可以轻松地为发布版本省去昂贵的配置文件代码。

通常,缺少符号时,Visual Studio将使代码变灰。如果尝试从不包含此代码的版本中访问此代码,则会出现编译器错误。

要小心,因为过度使用这些指令 可能是代码的味道,请参见Quote needed: Preprocessor usage is bad OO practice