検証を必要とせずに100%正しいと思っていることがある.

3728 ワード

Technoratiラベル:
Nullable<T> ,
汎用拘束struct ,
こうぞうインタフェースへんかん
  • Nullable
  • 拡張値タイプが空の値を表すことができないために拡張されたクラスです.
    	var i = new Nullable<int>(3);
                
            object box = i;//      ,  i  ,     Value  box,   null  box
            Console.Write(box);

    しかし、ILを見ると、box(空のタイプ≠参照タイプ、box)が必要であることがわかります.
     
        L_0000: nop 
        L_0001: ldc.i4.3 
        L_0002: newobj instance void [mscorlib]System.Nullable`1<int32>::.ctor(!0)
        L_0007: box [mscorlib]System.Nullable`1<int32>
        L_000c: stloc.0 
        L_000d: ldloc.0 
        L_000e: call void [mscorlib]System.Console::Write(object)
        L_0013: nop 
    

     
    MSDNは以下のように記述されている.
    空のタイプを梱包する場合、共通言語実行ライブラリは、Nullableオブジェクト自体ではなくNullableオブジェクトの基礎値を自動的に梱包します.すなわち、HasValue属性がtrueであれば、Value属性のコンテンツが箱詰めされる.HasValue属性がfalseの場合、空の参照(Visual BasicではNothing)が箱詰めされます.空のタイプのベース値を箱詰め解除すると、共通言語実行ライブラリは、ベース値に初期化された新しいNullable構造を作成します.
    Nullableが空きタイプになっている以上、当然boxは必要ないと思っていた.しかし、髪先をよく見るとNullableは普通のstructにすぎない.
     
  • 拘束汎用struct
  • 次のような汎用メソッドを定義し、Structで汎用パラメータを拘束します.
    	static void GenericVoid<T>(T i) where T : struct
            {
    
            }
      Nullable<int> struct,            :
    GenericVoid<Nullable<int>>(i);
            ,     :  “int?”        null                “TSharp.Core.Test.ThreadClass.GenericVoid<T>(T)”    “T”
         struct  “     null     ”
     
  • 構造からインタフェースへの変換にはboxは必要ですか?
  • 	public interface IPoint { int X { get; } int Y { get; } }
            struct Point : IPoint
            {
                public int X { get; set; }
                public int Y { get; set; }
            }

    呼び出しコード:
                IPoint p = new Point();
                Console.Write(p);
    ILの表示:
    .method private hidebysig static void Main(string[] args) cil managed
    {
        .entrypoint
        .maxstack 1
        .locals init (
            [0] class TSharp.Core.Test.ThreadClass/IPoint p,
            [1] valuetype TSharp.Core.Test.ThreadClass/Point CS$0$0000)
        L_0000: nop 
        L_0001: ldloca.s CS$0$0000
        L_0003: initobj TSharp.Core.Test.ThreadClass/Point
        L_0009: ldloc.1 
        L_000a: box TSharp.Core.Test.ThreadClass/Point
        L_000f: stloc.0 
        L_0010: ldloc.0 
        L_0011: call void [mscorlib]System.Console::Write(object)
        L_0016: nop 
        L_0017: ret 
    }             box,  struct         。
  • 列挙デフォルトはInt 32
  • 列挙指定ベースクラスが表示する場合、デフォルトはInt 32であり、そのTypeコードもTypeコードである.Int32.
                object detectorObj = MyEnum.B;
                TypeCode typeCode = System.Convert.GetTypeCode(detectorObj);