黑马程序员技术交流社区

标题: 关于C#结构初始化的小问题 [打印本页]

作者: 古古头    时间: 2012-7-2 23:40
标题: 关于C#结构初始化的小问题
MSDN上说:“当结构包含引用类型作为成员时,必须显式调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。 (这将导致编译器错误 CS0171。)”
但是,请看我的代码:
  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             S s;
  6.             s.p = null;
  7.             Console.WriteLine(s);
  8.             Console.Read();
  9.         }
  10.     }
  11.     struct S
  12.     {
  13.         public Program p;
  14.     }
复制代码
我的结构S里有引用成员p,p并没有显示调用默认构造函数,但结构仍然可用。
并没有发生错误,这句话到底说的是什么意思?

作者: xiaozehope    时间: 2012-7-3 01:06
你这样不就是强制赋值为null了吗,msdn上说保持未赋值状态就是S.p 是没有赋值的,不可以直接用。
作者: 古古头    时间: 2012-7-3 08:18
xiaozehope 发表于 2012-7-3 01:06
你这样不就是强制赋值为null了吗,msdn上说保持未赋值状态就是S.p 是没有赋值的,不可以直接用。 ...

对于应用类型的成员,MSDN的原话是说“必须显示调用该成员的默认构造函数”,但我只是为该成员赋值null,没有调用构造函数,所以感到纳闷。不知道是不是我对这句话的理解有问题。
作者: 许庭洲    时间: 2012-7-3 08:25
可能除了特殊情况,含有Main函数的类去引用成员p不会显示调用默认构造函数。
作者: 古古头    时间: 2012-7-3 08:46
许庭洲 发表于 2012-7-3 08:25
可能除了特殊情况,含有Main函数的类去引用成员p不会显示调用默认构造函数。 ...

我想说明的是结构的成员是一个引用类型,跟是否含有Main函数没关系:
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             S s;
  6.             s.p = null;
  7.             Console.WriteLine(s);
  8.         }
  9.     }
  10.     class C
  11.     {
  12.     }
  13.     struct S
  14.     {
  15.         //int s = 0;
  16.         class SS
  17.         {
  18.         }
  19.         public C p;
  20.     }
复制代码

作者: 许庭洲    时间: 2012-7-3 08:53
古古头 发表于 2012-7-3 08:18
对于应用类型的成员,MSDN的原话是说“必须显示调用该成员的默认构造函数”,但我只是为该成员赋值null, ...

可能老外是针对继承关系的类来说的,若涉及到主函数会失效的。
作者: 郑玉赛    时间: 2012-7-3 15:06
那上面的意思是说必须调用引用成员的够造函数,而你的代码
作者: 郑玉赛    时间: 2012-7-3 21:47
意思是必须调用结构中的引用成员的构造函数,不是调用结构的构造函数。你那样没有使用那个引用成员,所以不会报错,我给你下面这一段代码
class Program
    {

        static void Main(string[] args)
        {
            S s();
            s.p.SayHi();
            Console.ReadKey();
        }

    }

    struct S
    {

        public Person p;

    }
    public class Person
    {
        public void SayHi()
        {
            Console.WriteLine("这里Person类");
        }
    }
这样的话就会报错。调用引用成员的构造函数就是说给引用成员赋值,没赋值,就没办法使用引用成员的方法或者属性。
作者: 郑玉赛    时间: 2012-7-3 21:53
刚没注意 上面的那个S s(),s后面不该有括号。当结构中有引用类型和值类型一起的时候,调用结构的构造函数,也就是new一个结构,就会给结构中的成员赋默认值,值类型看类型而定,int就为零,booL为flase。那引用类型就是为null。所以不能直接使用该引用成员中的方法或者属性。这就是我对那句话的理解,总结一下,就是引用类型的默认值为null,所以不能使用该引用类型成员。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2