問題タブ [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 投票する
4 に答える
334 参照

c# - #if/#endif とは対照的に、条件付き属性の欠点は何ですか?

私のコード ベースには、#if DEBUG/#endif実稼働環境で実行する勇気がないアサーション タイプのロジックを主に含む多くのステートメントがあります。

これらすべてを新しい方法に変更したことを後悔しますか?

更新: アサーションを行うための 2 つの類似しているが異なる構文スタイルの特性の違いを探しています。アプリケーションの動作を実証する方法は他にもたくさんあることは理解しており、私もそれを行っています。アサーションを完全に放棄する準備はできていません。

また、現実的なデバッグ リリースのみのシナリオに合わせてメソッド名を更新しました。

0 投票する
5 に答える
4838 参照

c# - インターフェイスメンバーのC#条件付き属性

代わりにConditional属性を使用して、コード内の「#if TRACE」ディレクティブを削除しようとしていますが、このアプローチをインターフェイスに簡単に適用することはできません。私にはこれを回避する方法がありますが、それはかなり醜いです、そして私はより良い解決策を探しています。

たとえば、条件付きでコンパイルされたメソッドとのインターフェースがあります。

インターフェイスで条件属性を使用できません:

インターフェイスメソッドに、具象クラスの条件付きプライベートメソッドを呼び出すだけで済みます。

これにより、非TRACEビルドで「nop」TraceOnlyDoIt()メソッドへの冗長な呼び出しがクライアントコードに残ります。インターフェイスの条件付き拡張メソッドでそれを回避することはできますが、少し醜いです。

これを行うためのより良い方法はありますか?

0 投票する
3 に答える
1724 参照

c# - 条件付き属性を使用して、同様のデバッガーとランタイムメソッドを作成することは可能ですか?

同じメソッド名を持つ2つのメソッドを作成し、値を渡して、条件付き属性といくつかの反条件付きを使用して返すことは可能ですか?

メソッドを呼び出すだけで、「デバッグ」が定義されているかどうかに基づいて、コンパイラはどのメソッドを選択しますか?

ありがとう

0 投票する
1 に答える
109 参照

c# - ConditionString を使用して特定の属性インスタンスを取得する

これはばかげた質問かもしれません。条件付き属性の概念を理解しようとしています。私の目的は、特定の属性インスタンスを取得することであり、出力「CONDITION1」ではなく NullReferenceException を取得することになりました。

GetCustomAttribute で正しい属性を使用していることを願っています。誰かが間違いを指摘できますか?

前もって感謝します。

0 投票する
2 に答える
1025 参照

c# - クラスで ConditionalAttribute を使用できないのはなぜですか?

宣言を調べたところ、次のようにConditionalAttribute宣言されています。

次のような JavaScript コードを見つけました。

属性をクラスに適用できることを意味するとAttributeTargets.Class主張されています。だから私はこれを試しました:

しかし、コンパイラは次のエラーを出力します

エラー CS1689: 属性 'System.Diagnostics.ConditionalAttribute' はメソッドまたは属性クラスでのみ有効です

そしてMSDNは言う

このエラーは、ConditionalAttribute 属性でのみ発生します。メッセージにあるように、この属性はメソッドまたは属性クラスでのみ使用できます。たとえば、この属性をクラスに適用しようとすると、このエラーが発生します。

クラスに適用可能であると宣言された属性があるように見えますが、それをクラスに適用しようとすると、コンパイル エラーが発生します。

これはどのように可能ですか?それはハードワイヤードの特別なケースですか、それとも何ですか?

0 投票する
2 に答える
950 参照

c# - ConditionalAttribute を使用すると、引数の計算も削除されますか?

次のコードを試しました:

リリースビルドでは例外がスローされないように見えるため、 でマークされたメソッドへの呼び出しConditionalAttributeが削除されるだけでなく、パラメーターの計算も削除されます。

そのような動作は保証されていますか?

0 投票する
1 に答える
152 参照

f# - ユニットの結果を必要とする ConditionalAttribute と組み合わせて、printfn スタイルの TextWriterFormat の機能を活用する方法

sprintfまたはのように動作するトレース関数を作成するように設定しましたprintfnが、ConditionalAttribute.

これまでの結果: ありえないと思います。

Conditional("DEBUG")問題は、属性を使用する場合、関数が単位の結果を返さなければならないという事実に集中しています。「通常の」引数は正常に機能し、メソッドは適切に装飾されています (編集:装飾されていますが、カリー化可能なメンバーは消去されていません。議論を参照してください。代わりにタプル形式を使用する必要があります):

ignore(がないと、Conditional 属性のためにコンパイルされないことに注意してください)

しかし、 のバリアントを試すとすぐPrintf.TextWriterFormat<'T>に失敗し、それを回避する方法がわかりません。

これは属性なしで機能しますが属性を使用すると、次のようになります。

この式には型があると予想されて
      unit
いましたが、ここには型があります
      string -> unit

エラーには具体的に下線が引かれてTrace.trace "hello: %s"います。したがって、コンパイラは、式全体が になることを認識していないように見え、unitを返すラッパー関数を内部的に作成するため、エラーが発生しますstring -> unit。これは、 の規則では許可されていませんConditionalAttribute

:unit関数の戻り値の型を明示的に指定するかprintfn msg |> ignore、本体として修正しようとすると、テキスト ライターの書式指定文字列をタイプ セーフで使用できなくなります。実際には、呼び出しの 2 番目の引数が認識されません。 -サイトはもうありません。

したがって、関数シグネチャ全体は CLR の規則に従いますが、F# が作成するインライン関数は、少なくともこの特定のケースではそうではないようです。

を含むバリアントを試してkprintfsprintfそれが役立つかどうかを確認しましたが、すべて役に立ちませんでした。

何か案は?それとも、これは、カーペットを敷こうとして、一方の角を適切に滑らかにすると、もう一方の角で泡立ち、逆の場合、つまり収まらないという状況の 1 つですか?


PS:なぜ私がそれを望んでいるのか疑問に思っている場合: 既存の Trace のように動作する便利な関数を作成しようとしていますが、内部では他の機能が実行されています。私が現在持っているものは機能しますが、静的に型チェックされた引数ではなく文字列を取るだけなので、ユーザーは次のようなものを書く必要があります:

0 投票する
0 に答える
133 参照

spring - カスタム JSP タグに条件付きで属性を含める方法はありますか?

3つの属性を取ることができるフィールドがあるとしましょう

変数が空白でない場合にのみ、これらの a、b、c 属性を含めたいとしましょう。だからELだとこうなる

1 つ以上の変数が空白の場合 (たとえば varB が空の場合)、次のような出力が得られます。

したがって、b はまだ存在しますが、空白の値を渡します。これにより、属性が空白の場合、一部のスプリング<form:etc>タグで問題が発生する可能性があります (たとえば、form:options の itemLabel など)。属性が完全に表示されないようにする簡単な方法はありますか?

私は私ができることを理解しています

しかし、それは、それぞれが空白になる可能性がある場合、属性の数が増えるにつれて、巨大な決定木が必要になることを意味します。

これを行うためのより良い方法を知っている人はいますか?