【2回目の編集】
@Guillaume は、OP へのコメントで正しい答えを提案しているように思えます。そこで彼は、OP がカスタム リンクを使用して、問題のプロパティが最適化されないようにすることを提案しています: http://docs.xamarin.com /guides/ios/advanced_topics/linker#3.custom-linking
@Guillaumeがそれを答えとして書いた場合、彼が正当に信用できるように、この編集を削除します.
元の答え:
どうですか:
if ("".Length > 0)
リリースビルド(VS2012、.Net 4.5)のリフレクターでこのコードをチェックしました
void Run()
{
if ("".Length > 0)
{
Console.WriteLine();
}
}
そして、次の IL が生成されます。
.method private hidebysig instance void Run() cil managed
{
.maxstack 8
L_0000: ldstr ""
L_0005: callvirt instance int32 [mscorlib]System.String::get_Length()
L_000a: ldc.i4.0
L_000b: ble L_0015
L_0010: call void [mscorlib]System.Console::WriteLine()
L_0015: ret
}
編集: これが機能するかどうかについてはいくつかの議論があるように思われるので、もう少し証拠を提供させてください.
目標は、生成されたコードがプロパティにアクセスできるようにすることです。
この C# コードを考えると:
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
new Program().Run();
}
void Run()
{
if ("".Length > 0)
{
Test t = new Test();
Trace.WriteLine(t.Property); // Make sure we use the property.
}
}
}
internal class Test
{
public int Property { get; set; }
}
}
Run()
リリース ビルドのメソッド用に生成された IL コードは次のとおりです。
.method private hidebysig instance void Run() cil managed
{
.maxstack 5
.locals init (
[0] class ConsoleApplication1.Test t)
L_0000: ldstr ""
L_0005: callvirt instance int32 [mscorlib]System.String::get_Length()
L_000a: ldc.i4.0
L_000b: ble L_0026
L_0010: newobj instance void ConsoleApplication1.Test::.ctor()
L_0015: stloc.0
L_0016: ldloc.0
L_0017: callvirt instance int32 ConsoleApplication1.Test::get_Property()
L_001c: box int32
L_0021: call void [System]System.Diagnostics.Trace::WriteLine(object)
L_0026: ret
}
したがって、プロパティは出力コードで確実に参照されています。したがって、これは要件を満たしています。