【问题标题】:Renaming variables inside preprocessor directives in Visual Studio在 Visual Studio 的预处理器指令中重命名变量
【发布时间】:2017-03-22 11:47:20
【问题描述】:

我遇到了一个方便问题,如果我希望某些东西只在特定平台上执行,编译器会停止检查和重构代码。所以在这种情况下,如果我在 Visual Studio 中将foo 重构为bar,它只会将foo = true 部分重构为bar = true,但foo = false 不会被更改。

bool foo;
#if UNITY_EDITOR
    foo = true;
#else
    foo = false;
#endif

为了避免这种情况,在某些情况下我将代码更改为

bool foo;
#if UNITY_EDITOR
    foo = true;
    return;
#endif
    foo = false;

但这不仅更乏味,因为我必须确保在将某些内容分配给 foo 后我可以返回,我还会在 Unity 编辑器中收到有关无法访问代码的警告。

所以我的问题是:处理这个问题的最佳方法是什么?是否可以让 Visual Studio 也对当前平台未使用的代码进行代码检查和重构?

【问题讨论】:

    标签: c# visual-studio unity3d preprocessor-directive


    【解决方案1】:

    当使用的预处理器指令(UNITY_EDITOR) 是true 时,#else#elif 语句中的其余代码现在被视为注释。

    这在 Visual Studio 2015 及更高版本中有一个简单的修复。重命名变量时,请选中 Include Comments 复选框。

    【讨论】:

    • 谢谢伙计,你对我所有的问题都很有帮助!
    • 但是:是否可以在 cmets 中添加语法检查?
    • gif显示else子句中确认后的实际没有重命名!所以它不能按预期工作
    【解决方案2】:

    据我所知,纯 VS 不支持。如果您使用 Resharper,它会在脚本中逐字搜索重构后的名称,并可以做您想做的事情。但是,它是付费扩展。如果您不想为此花任何钱,您可以随时使用Application.isEditorApplication.platform 来编写与平台相关的代码。但是,只有在给定平台上才存在命名空间可能会出现问题 - 即 using UnityEngine.iOS 在 Android 上将无法编译。我个人避免使用预处理器指令,只有在没有其他方法时才使用它们。所以实际上我使用预处理器指令的唯一情况是当我需要使用平台特定的命名空间时,比如上面提到的UnityEngine.iOSUnityEditor

    【讨论】:

    • 我有很多用例,我需要特定于平台的代码,因此避免这种情况对我来说并不是一个真正的选择。我会看看 Resharper,但我当然希望有免费的替代品。
    • 是的,但是使用 Application.platform 呢?这不涵盖您的大部分案例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2019-10-04
    • 2010-09-20
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多