3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C# Conditional属性の罠

Posted at

問題の概要

defineを定義し、Conditionalを使用したのに何故か関数が呼ばれないぞ???
といった事件に出会しました。

こんな感じ

#define Debug_AAA
public class AAA
{
	public AAA()
	{
		new BBB().Method_DebugAAA();
		new BBB().Method_DebugBBB();
	}
}
#define Debug_BBB

using System.Diagnostics;

public class BBB
{
	[Conditional ("Debug_AAA")]
	public void Method_DebugAAA()
	{
		UnityEngine.Debug.Log("AAAから呼び出したなら、ログが出るよ");
	}

	[Conditional ("Debug_BBB")]
	public void Method_DebugBBB()
	{
		UnityEngine.Debug.Log("AAAから呼び出した時は、ログが出ないよ");
	}
}

(Unityで作業してたので、ログ出力がUnity仕様なのは堪忍でござる)

どゆこと?

どうやら、Conditional属性はスクリプト内のdefineではなく、呼び出し元のdefineを参照してるらしい。
(リファレンス読んでない人並みの感想)
そもそも、各々のスクリプトでdefineを設定してるのが良くないのかもしれませんね ^^;

最後に

defineを外(例えばUnityのScriptingDefineSymbols等)で定義してて
下記のように使いたい時に困っちゃう...気が...

#if Debug_AAA || Debug_BBB
#define ORIGINAL_DEBUG
#endif

[Conditional ("ORIGINAL_DEBUG")]
public void OriginalDebugMethod(){}

とりあえず私のプロジェクトではdefineを整理することにしてみます。
場合によっては素直に#if使うとかですかね。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?