比较长,在
http://bosrandomwords.blogspot.com/
希望指点

解决方案 »

  1.   

    Internet Explorer 不能链接到您请求的网页。此页可能暂时不可用。 --------------------------------------------------------------------------------请尝试以下操作:单击刷新按钮,或以后再试。如果您以前查看过该页,现在要查看计算机上存储的内容,请单击文件,然后单击脱机工作。要获得有关使用 Internet Explorer 脱机浏览的信息,请单击帮助菜单,然后单击目录和索引。
    Internet Explorer  
      

  2.   

    sorry, 难道国内不允许访问blogspot??? 只好全部贴在这里: C# 面试问题讨论
    最近被面试了很多次,也做了很多笔试题。一些有意思的/不确信的问题希望讨论一下:Q: Within an instance constructor of a struct type, which one of the following key words behaves exactly as an output parameter of the struct type?
    问题:在结构(struct)的实例构造函数内部,以下哪个关键字的作用和使用方法和一个该结构(struct)类型的output参数完全一样?A. object
    B. this
    C. value
    D. ref
    E. base讨论:因为struct是value type,不能有缺省得构造函数( parameterless instance constructor),所以显然程序类似这样:struct MyStruct
    {
    public MyStruct(out MyStruct myStructVar)
    {
    myStructVar = new MyStruct();
    ??? = new MyStruct();
    }
    }首先A(object), C(value)和D(ref)可以先排除了, base用到这里也太玄了(struct的父类型是System.ValueType),所以用排除法应当选B(this).
    求其所以然:
    究竟什么是 behaves exactly as an output parameter of the struct type?这个题目本身可能没有表达清楚所有的上下文。所以我不打算钻牛角尖。首先我们可以在VS.NET2003中做以下的测试:struct MyStruct
    {
    public MyStruct(out MyStruct myStructVar)
    {
    myStructVar = new MyStruct();
    this=new MyStruct();
    }
    [STAThread]
    static void Main(string[] args)
    {
    MyStruct b;
    MyStruct a = new MyStruct(out b);
    }
    }#############ilasm#############
    .method public hidebysig specialname rtspecialname
    instance void  .ctor([out] valuetype ConsoleAppl.....
    {
    // Code size       15 (0xf)
    .maxstack  1
    IL_0000:  ldarg.1
    IL_0001:  initobj    ConsoleApplication5.MyStruct
    IL_0007:  ldarg.0
    IL_0008:  initobj    ConsoleApplication5.MyStruct
    IL_000e:  ret
    } // end of method MyStruct::.ctorMSDN上讲:“If the struct instance constructor doesn't specify a constructor initializer, the this variable corresponds to an out parameter of the struct type, and similar to an out parameter, this must be definitely assigned at every location where the constructor returns.” 似乎可以解释。但是,我不久又发现以下的code完成一样的结果:struct MyStruct
    {
    Object obj;
    public MyStruct(out MyStruct myStructVar)
    {
    myStructVar = new MyStruct();
    //this=new MyStruct();
    this.obj = "some string value";
    }
    [STAThread]
    static void Main(string[] args)
    {
    MyStruct b;
    MyStruct a = new MyStruct(out b);}
    }
    #############ilasm#############
    .method public hidebysig specialname rtspecialname
    instance void  .ctor([out] valuetype ConsoleAppl.....
    {
    // Code size       19 (0x13)
    .maxstack  2
    IL_0000:  ldarg.1
    IL_0001:  initobj    ConsoleApplication5.MyStruct
    IL_0007:  ldarg.0
    IL_0008:  ldstr      "some string value"
    IL_000d:  stfld      object ConsoleApplication5.MyStruct::obj
    IL_0012:  ret
    } // end of method MyStruct::.ctorasm里面第二种方式少call 一次 initobj ConsoleApplication5.MyStruct !!! 对我这个接触CLR不久的人来说很惊讶。似乎只要有任何的初始化的语句就可以了。结论一: 在结构(struct)的实例构造函数内必须作以下之一的初始化:   1. 使用传统的constructor initializer
       2. definitely assign this
       3. 显式地初始化this的成员这个结论似乎比较自然,但仍需要进一步的讨论深层的原因。
    另外还有一个小问题,当我去掉 myStructVar = new MyStruct(); 一行后,也可以通过编译。struct MyStruct
    {
    public MyStruct(out MyStruct myStructVar)
    {
    this=new MyStruct();
    }
    [STAThread]
    static void Main(string[] args)
    {
    MyStruct b;
    MyStruct a = new MyStruct(out b);}
    }myStructVar 似乎并不需要显式地赋值(definitely assigned)。这似乎和out参数矛盾?例如,以下会导致编译错误:class MyClass{
    public MyClass(out MyClass myClassObj)
    {
    }
    [STAThread]
    static void Main(string[] args)
    {
    MyClass b;
    MyClass a = new MyClass(out b);}
    }但是一想,MyStruct是个value type。可能有一些关系。但是尚无合理的解释。
    (仍在痛苦地学习软件英文词汇的中文翻译)
      

  3.   

    好费劲才看明白……
    你的意思是一个结构体作为out的参数传给自己的构造函数的时候,如果这个结构体还没有初始化就会自动地调用默认构造函数?
      

  4.   

    经过仔细调查,这个问题是个1.1 的bug