Interfaceは参照型だったよな。と思い確認。
class Program
{
static void Main(string[] args)
{
Struct s = new Struct();
s.MyProperty = 1;
Interface i = s;
i.MyProperty = 2;
Interface i2 = i;
i2.MyProperty = 3;
Console.WriteLine("s :{0}", s.MyProperty);
Console.WriteLine("i :{0}", i.MyProperty);
Console.WriteLine("i2:{0}", i2.MyProperty);
}
}
interface Interface
{
int MyProperty { get; set; }
}
struct Struct : Interface
{
public int MyProperty { get; set; }
}
正解。
つまり、Interface型に代入する際にボックス化が行われているということ。
class Program
{
static void Main(string[] args)
{
var val = new Struct();
var val2 = new Class();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000000; i++)
{
object obj = val;
}
Console.WriteLine("struct -> object :" + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
Interface obj = val;
}
Console.WriteLine("struct -> Interface:" + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
var obj = val;
}
Console.WriteLine("struct -> struct :" + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
Interface obj = val2;
}
Console.WriteLine("class -> Interface:" + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
object obj = val2;
}
Console.WriteLine("class -> object :" + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
var obj = val2;
}
Console.WriteLine("class -> class :" + sw.Elapsed);
}
}
interface Interface
{
int MyProperty { get; set; }
}
struct Struct : Interface
{
public int MyProperty { get; set; }
}
class Class : Interface
{
public int MyProperty { get; set; }
}
0 件のコメント:
コメントを投稿