CS.BOXING

可能な限り、ボックス化/ボックス化解除を避けます。

オブジェクト参照が予想される場所で値の型が使用されると、その値の型は、"box" に配置することで、オブジェクトに自動的に変換されます。少なくとも、これは効率的でない場合が多くなります。

脆弱性とリスク

ボックス化されたオブジェクトがコレクションで使用されると、予期しない動作が生じる可能性があります。さらに、ボックス化は自動的に発生するため、導入されていたことに気づかない場合があります。ボックス化が意図された動作であったかどうかを確認するのは常に価値があります。

脆弱コード例

コピー
  using System.Collections;
  public struct MyData
  {
      int _data;
      public MyData(int data)
      {
         _data = data;
      }
      public void setData(int newData)
     {
         _data = newData;
     }
 }
 public class Worker
 {
     public static void work()
     {
         ArrayList datasCollection = new ArrayList();
         MyData data = new MyData(0);
         datasCollection.Add(data); //boxing - rule violation
         //.....
         MyData currentData = (MyData)datasCollection[0]; //unboxing - rule violation
         currentData.setData(1);
     }
 }

修正コード例

コピー
  // Fix #1
  using System.Collections;
  public class MyData
  {
      int _data;
      public MyData(int data)
      {
          _data = data;
      }
     public void setData(int newData)
     {
         _data = newData;
     }
 }
 public class Worker
 {
     public static void work()
     {
         ArrayList datasCollection = new ArrayList();
         MyData data = new MyData(0);
         datasCollection.Add(data);
         //.....
         MyData currentData = (MyData)datasCollection[0];
         currentData.setData(1);
     }
 }