关于结构的默认值

时间:2020-12-19 09:53:54
如5.2节所述,有几种变量在创建时将自动初始化为它们的默认值。对于类类型和其他引用类型的变量,此默认值为null。但是,由于结构是不能为null的值类型,因此结构的默认值,是通过将所有值类型域设置为它们的默认值,并将所有引用类型域设置为null而产生的值。

对于上面示例中所声明的Point结构,示例:

Point[] a=new Point[100];

会将数组中的每个Point初始化为通过将x和y域设置为零而产生的值。

一个结构的默认值对应于该结构的默认构造函数所返回的值(参见4.1.1小节)。与类不同,结构不允许声明无参数的实例构造函数。相反,每个结构都隐式地具有一个无参数的实例构造函数,该构造函数总是返回通过将所有值类型的域设置为它们的默认值,并将所有引用类型的域设置为null而得到的值。

在设计结构时,要设法确保其默认初始化状态是有效的状态。在下面的示例中:

using System;

struct KeyValuePair

{

  string key;

  string value;

  public KeyValuePair(string key, string value) {

    if (key == null || value == null) throw new ArgumentException();

    this.key = key;

    this.value = value;

  }

}

除非在显式调用时,否则用户自定义的实例构造函数不允许出现null值。在变量KeyValuePair可能会被初始化为它的默认值的情况下,key和value域都将为null,所以设计该结构时,必须正确处理好此问题。

这是我摘抄的,我一直对结构的默认值不理解,有谁可以给我介绍一下上面的例子他主要讲的是什么意思?谢谢

10 个解决方案

#1


结构内置不带任何参数的构造函数,在不带参数的构造函数里将所有只断设置默认值。
所以用户不能声明不带参数的构造函数。

#2


���������������أ��������˴��в����Ĺ��캯����
��˵Ϊʲô�������ֶε�null��ȥ��������������͵�Ĭ�Ͼ���null��

#3


晕怎么成这个样了?我是说上面声明了带有参数的构造函数,
但为什么把字符串为null给异常,结构中不是会将引用变为null吗?
那设置成null有什么错?

#4


1 结构隐含一个无参数的构造函数,因此用户要么不自定义构造函数,要么就得定义有参数的构造函数
2 尽量保证自定义构造函数能够将其成员进行有效的赋予默认值
他那个例子说明了如果你要自定义构造函数,最好能在初始化结构成员的时候赋上有效的值(实际就是调用的时候要传入有效的值,如果你传入的类型不匹配编译不能通过,如果匹配但是无效对于初始化就是一种浪费,比如他说的key,value任一个不能为null,那只是从实际编程来说,但是如果就实际来说你可以赋值为null。

#5


呵呵前后实际不一样的意思,前面的实际编程意思就是指的实际应用比如做项目做工程,后一个实际指的是从程序的角度来看从语言定义编译和执行来说

#6


楼上正确

#7


#1 using System;
#2 struct KeyValuePair{
#3  string key;
#4  string value;
#5  public KeyValuePair(string key, string value) {
#6    if (key == null || value == null) throw new ArgumentException();
#7    this.key = key;
#8    this.value = value;
#9  }
#10}

1) 结构可以含有构造函数,但构造函数一定要包含参数
    第5行就是一个构造,它必须含有 key 和 value 至少一个参数
2) 结构的字段不能在声明时被初始化
    地3行和第4行如果写成下面的形式就是错误的:
    string key = "someValue"; // 不允许初始化变量,除非在构造函数中

    第6行的代码不是必须,结果中既然可以包含引用类型的字段,就应该允许接受引用自动的所有合法值,包括null
    而第6行的代码无非是结构的自我约束,因为对于这个机构来说,null值毫无意义。

#8


结构可以含有构造函数,但构造函数一定要包含参数 
    第5行就是一个构造,它必须含有 key 和 value 至少一个参数 
-------------------------
明显表述有误,结构隐含了一个无参数构造函数,所以结构含有构造函数,且是无参数的,但是如果要自定义构造函数则必须是有参数的!

#9


其实每个类或结构都有一个无参构造函数,只是对你是透明的

#10


给四个双引号进去试试,不要写null,它们的意义是不同的,不过只能是试试,呵呵

#1


结构内置不带任何参数的构造函数,在不带参数的构造函数里将所有只断设置默认值。
所以用户不能声明不带参数的构造函数。

#2


���������������أ��������˴��в����Ĺ��캯����
��˵Ϊʲô�������ֶε�null��ȥ��������������͵�Ĭ�Ͼ���null��

#3


晕怎么成这个样了?我是说上面声明了带有参数的构造函数,
但为什么把字符串为null给异常,结构中不是会将引用变为null吗?
那设置成null有什么错?

#4


1 结构隐含一个无参数的构造函数,因此用户要么不自定义构造函数,要么就得定义有参数的构造函数
2 尽量保证自定义构造函数能够将其成员进行有效的赋予默认值
他那个例子说明了如果你要自定义构造函数,最好能在初始化结构成员的时候赋上有效的值(实际就是调用的时候要传入有效的值,如果你传入的类型不匹配编译不能通过,如果匹配但是无效对于初始化就是一种浪费,比如他说的key,value任一个不能为null,那只是从实际编程来说,但是如果就实际来说你可以赋值为null。

#5


呵呵前后实际不一样的意思,前面的实际编程意思就是指的实际应用比如做项目做工程,后一个实际指的是从程序的角度来看从语言定义编译和执行来说

#6


楼上正确

#7


#1 using System;
#2 struct KeyValuePair{
#3  string key;
#4  string value;
#5  public KeyValuePair(string key, string value) {
#6    if (key == null || value == null) throw new ArgumentException();
#7    this.key = key;
#8    this.value = value;
#9  }
#10}

1) 结构可以含有构造函数,但构造函数一定要包含参数
    第5行就是一个构造,它必须含有 key 和 value 至少一个参数
2) 结构的字段不能在声明时被初始化
    地3行和第4行如果写成下面的形式就是错误的:
    string key = "someValue"; // 不允许初始化变量,除非在构造函数中

    第6行的代码不是必须,结果中既然可以包含引用类型的字段,就应该允许接受引用自动的所有合法值,包括null
    而第6行的代码无非是结构的自我约束,因为对于这个机构来说,null值毫无意义。

#8


结构可以含有构造函数,但构造函数一定要包含参数 
    第5行就是一个构造,它必须含有 key 和 value 至少一个参数 
-------------------------
明显表述有误,结构隐含了一个无参数构造函数,所以结构含有构造函数,且是无参数的,但是如果要自定义构造函数则必须是有参数的!

#9


其实每个类或结构都有一个无参构造函数,只是对你是透明的

#10


给四个双引号进去试试,不要写null,它们的意义是不同的,不过只能是试试,呵呵