对于上面示例中所声明的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��
��˵Ϊʲô�������ֶε�null��ȥ��������������͵�Ĭ�Ͼ���null��
#3
晕怎么成这个样了?我是说上面声明了带有参数的构造函数,
但为什么把字符串为null给异常,结构中不是会将引用变为null吗?
那设置成null有什么错?
但为什么把字符串为null给异常,结构中不是会将引用变为null吗?
那设置成null有什么错?
#4
1 结构隐含一个无参数的构造函数,因此用户要么不自定义构造函数,要么就得定义有参数的构造函数
2 尽量保证自定义构造函数能够将其成员进行有效的赋予默认值
他那个例子说明了如果你要自定义构造函数,最好能在初始化结构成员的时候赋上有效的值(实际就是调用的时候要传入有效的值,如果你传入的类型不匹配编译不能通过,如果匹配但是无效对于初始化就是一种浪费,比如他说的key,value任一个不能为null,那只是从实际编程来说,但是如果就实际来说你可以赋值为null。
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值毫无意义。
#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 至少一个参数
-------------------------
明显表述有误,结构隐含了一个无参数构造函数,所以结构含有构造函数,且是无参数的,但是如果要自定义构造函数则必须是有参数的!
第5行就是一个构造,它必须含有 key 和 value 至少一个参数
-------------------------
明显表述有误,结构隐含了一个无参数构造函数,所以结构含有构造函数,且是无参数的,但是如果要自定义构造函数则必须是有参数的!
#9
其实每个类或结构都有一个无参构造函数,只是对你是透明的
#10
给四个双引号进去试试,不要写null,它们的意义是不同的,不过只能是试试,呵呵
#1
结构内置不带任何参数的构造函数,在不带参数的构造函数里将所有只断设置默认值。
所以用户不能声明不带参数的构造函数。
所以用户不能声明不带参数的构造函数。
#2
���������������أ��������˴��в����Ĺ��캯����
��˵Ϊʲô�������ֶε�null��ȥ��������������͵�Ĭ�Ͼ���null��
��˵Ϊʲô�������ֶε�null��ȥ��������������͵�Ĭ�Ͼ���null��
#3
晕怎么成这个样了?我是说上面声明了带有参数的构造函数,
但为什么把字符串为null给异常,结构中不是会将引用变为null吗?
那设置成null有什么错?
但为什么把字符串为null给异常,结构中不是会将引用变为null吗?
那设置成null有什么错?
#4
1 结构隐含一个无参数的构造函数,因此用户要么不自定义构造函数,要么就得定义有参数的构造函数
2 尽量保证自定义构造函数能够将其成员进行有效的赋予默认值
他那个例子说明了如果你要自定义构造函数,最好能在初始化结构成员的时候赋上有效的值(实际就是调用的时候要传入有效的值,如果你传入的类型不匹配编译不能通过,如果匹配但是无效对于初始化就是一种浪费,比如他说的key,value任一个不能为null,那只是从实际编程来说,但是如果就实际来说你可以赋值为null。
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值毫无意义。
#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 至少一个参数
-------------------------
明显表述有误,结构隐含了一个无参数构造函数,所以结构含有构造函数,且是无参数的,但是如果要自定义构造函数则必须是有参数的!
第5行就是一个构造,它必须含有 key 和 value 至少一个参数
-------------------------
明显表述有误,结构隐含了一个无参数构造函数,所以结构含有构造函数,且是无参数的,但是如果要自定义构造函数则必须是有参数的!
#9
其实每个类或结构都有一个无参构造函数,只是对你是透明的
#10
给四个双引号进去试试,不要写null,它们的意义是不同的,不过只能是试试,呵呵