问题标签 [conditional-attribute]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
782 浏览

ruby - 方法的 Ruby 条件参数

我有一些基于 css 选择器提取数据的“通用”方法,这些选择器在许多网站中通常是相同的。但是,我有另一种方法可以接受给定网站的 css 选择器作为参数。

如果没有传递 title_selector 参数,我需要调用 get_title 方法。我怎样才能做到这一点?

接受 css 选择器作为参数的抓取

通用标题提取器

0 投票
2 回答
87 浏览

c# - 预处理器指令是否保护服务器代码不受客户端影响?

我正在开发一个客户端-服务器库。某些类可以由客户端或服务器使用,但执行方式不同,并且每个类产生的结果略有不同。同样,服务器代码可能包含不会从客户端构建中调用的其他方法。

一个类可能如下所示:

我读过 Conditional 属性仍然编译代码,因此会在构建中,不像预处理器指令会完全删除代码甚至不编译它。

我担心不诚实的客户可能会通过不混淆源代码并弄清楚服务器的工作原理来破解产品。

我的担心是没有根据的,还是我需要放置预处理器指令来隐藏源代码?

0 投票
1 回答
81 浏览

c# - 为什么条件方法的参数总是经过类型检查?

如果条件方法被编译掉,每次调用的参数仍然在编译时进行类型检查。这样做的动机是什么?例子:

需要明确的是,在此上下文中没有定义条件符号“条件”,因此从编译产生的 MSIL 中省略了方法调用。这与此处定义的规范一致,因此不足为奇。想象一个更复杂的场景:

只有在定义了条件符号“condition”时,“ConditionalMethod”的调用才会包含在结果编译中。然而,在这种情况下,Bar 实际上可以向上转换为 Foo。如果编译器知道对 'ConditionalMethod' 的调用将被编译掉,它是否也应该知道如果我们关心此方法的调用,此代码将是合法的?是的,这是一个人为的、令人毛骨悚然的例子,但它有助于说明我的问题。我是出于善意的好奇而问的,因为这已经激怒了我很长一段时间了。请帮忙,乔恩·斯基特。:)

0 投票
1 回答
763 浏览

c# - 方法的条件属性和计算参数

我的代码中有这样的代码

写上标有 [Conditional("DEBUG")] 的行,表示该方法的调用将在 release 中省略。

但是,它会在 RELEASE 中为该方法的参数调用 string.Format 还是将其删除?

0 投票
0 回答
40 浏览

c# - C#按符号不同的方法代码

我处于方法代码实现取决于所选 Visual Studio 解决方案配置的情况。

每个配置都针对不同的外部 DLL,该 DLL 提供不同的 API 版本,以便我区分它们。如果该信息有帮助,这些 DLL 将用于 Autodesk Revit API。

正如您可能认为的那样,每个 API 版本虽然非常相似,但它们之间可能存在细微差别,这迫使我根据目标版本使用不同的代码。

我为每个配置定义了不同的符号(REVIT_2014REVIT_2015等),我知道我可以依赖于好的旧#ifdef指令,但首先我想探索是否有更优雅的解决方案。

我已经阅读过ConditionalAttribute但我不能以我想要的方式使用它,即:

AsConditionalAttribute不允许覆盖方法,也不允许方法返回值。

在我开始用丑陋的指令困扰我的代码之前,我#ifdef还有其他解决方案吗?

提前致谢。

0 投票
0 回答
48 浏览

c# - AND-组合或否定 ConditionaAttribute 符号以避免生成 MSIL 调用

我需要在 C# 中进行一些条件编译,但也被要求保持全局符号计数低。所以不是#if ENABLE_MODULE(并添加很多符号),我主要做 opt-out #if !DISABLE_MODULE

在分析核心循环时,我希望能够很好地控制关闭的内容,以便更清晰地查看结果。但即使对于空的断言调用(#if在方法体内部),单独的调用也会花费大量时间。这就是为什么我开始使用[Conditional]属性来完全删除调用并避免将所有内容包含在#if降低代码可读性的部分中。

[Conditional]有一些警告:

  1. 只能一起 OR-ed。
  2. 否定使用 not ! 内部条件是不允许的。
  3. 没有办法将它们组合起来。
  4. 与#if 不同,它由调用者的文件范围符号定义而不是实际调用的方法文件范围符号定义来解释。

我想出了一个解决方法,但它并不漂亮并且倾向于重复代码(参见__Convoluted()下面的方法)。禁用#if部分中的代码被视为 Visual Studio 中的注释(因此没有名称重构),这使情况变得更糟,由于未检查所有符号组合等而变成损坏的提交。

我曾想过使用一些伞形符号,但这迫使我以正或的方式思考一切,有时我想要例如大多数断言但不从某个模块断言。

也许这有一个软件架构的答案,而不是一个实用的答案。

我正在使用 Unity,因此无法很好地控制每个配置(调试/发布/开发构建)的符号,而无需执行一些构建脚本来替换文件中的编译器参数(csc.rsp)

我的问题:有没有更好的方法来处理这个问题?

谢谢你的时间。

我做了一些功课尝试不同的选择并得出了一些结论(遵循代码)

最小测试用例 C# .NET 控制台应用程序

实用程序文件

不同的调用组合

当全局符号设置以下时,代码输出。请注意CallAndCallNot表明 Conditional 不像 #if 那样工作。