A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 古古头 中级黑马   /  2012-7-2 23:40  /  2259 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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并没有显示调用默认构造函数,但结构仍然可用。
并没有发生错误,这句话到底说的是什么意思?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

8 个回复

倒序浏览
你这样不就是强制赋值为null了吗,msdn上说保持未赋值状态就是S.p 是没有赋值的,不可以直接用。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
xiaozehope 发表于 2012-7-3 01:06
你这样不就是强制赋值为null了吗,msdn上说保持未赋值状态就是S.p 是没有赋值的,不可以直接用。 ...

对于应用类型的成员,MSDN的原话是说“必须显示调用该成员的默认构造函数”,但我只是为该成员赋值null,没有调用构造函数,所以感到纳闷。不知道是不是我对这句话的理解有问题。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
可能除了特殊情况,含有Main函数的类去引用成员p不会显示调用默认构造函数。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
许庭洲 发表于 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.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
古古头 发表于 2012-7-3 08:18
对于应用类型的成员,MSDN的原话是说“必须显示调用该成员的默认构造函数”,但我只是为该成员赋值null, ...

可能老外是针对继承关系的类来说的,若涉及到主函数会失效的。
回复 使用道具 举报
郑玉赛 来自手机 中级黑马 2012-7-3 15:06:13
7#
那上面的意思是说必须调用引用成员的够造函数,而你的代码
回复 使用道具 举报
意思是必须调用结构中的引用成员的构造函数,不是调用结构的构造函数。你那样没有使用那个引用成员,所以不会报错,我给你下面这一段代码
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类");
        }
    }
这样的话就会报错。调用引用成员的构造函数就是说给引用成员赋值,没赋值,就没办法使用引用成员的方法或者属性。
回复 使用道具 举报
刚没注意 上面的那个S s(),s后面不该有括号。当结构中有引用类型和值类型一起的时候,调用结构的构造函数,也就是new一个结构,就会给结构中的成员赋默认值,值类型看类型而定,int就为零,booL为flase。那引用类型就是为null。所以不能直接使用该引用成员中的方法或者属性。这就是我对那句话的理解,总结一下,就是引用类型的默认值为null,所以不能使用该引用类型成员。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马