结构struct(值类型)在实际应用要注意的二点:
2009-03-14 19:08
369 查看
.Net中的数据类型大致可以分为二类:一类是值类型,一类是引用类型;结构(struct)是值类型,从性能上考虑值类型更有优势(关于值类型与引用类型的详细讨论不在本文范围内,大家可以去查阅相关资料).对于一些特定场合:比如仅需要存储数据,不需要体现具体方法的时候,建议大家用struct来代替class,但在使用过程中,有几个容易被忽视的细节.
1.使用struct存储数据做为数据源,与数据显示控件绑定时:
代码如下:
public class MyClass
{
// Fields
[CompilerGenerated]
private string <Name>k__BackingField;
[CompilerGenerated]
private string <Value>k__BackingField;
// Methods
public MyClass(string pName, string pValue)
{
base..ctor();
this.Name = pName;
this.Value = pValue;
return;
}
// Properties
public string Name
{
[CompilerGenerated]
get
{
string str;
str = this.<Name>k__BackingField;
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.<Name>k__BackingField = value;
return;
}
}
public string Value
{
[CompilerGenerated]
get
{
string str;
str = this.<Value>k__BackingField;
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.<Value>k__BackingField = value;
return;
}
}
}
观察一下构造函数,变成了
...
base..ctor();
this.Name = pName;
...
关键就在这里:对于类来讲,并不要求在访问类的实例之前对所有成员赋值,所以这里引用this是合法的;而值类型要求在使用前必须对所有成员赋值,所以值类型如果在构造函数中直接给自动属性赋值,这里this代表的就是结构本身,而在此之前自动生成的二个私有成员private string <Name>k__BackingField和private string <Value>k__BackingField还没赋值,因此报错也就是合情合理了
1.使用struct存储数据做为数据源,与数据显示控件绑定时:
代码如下:
public class MyClass
{
// Fields
[CompilerGenerated]
private string <Name>k__BackingField;
[CompilerGenerated]
private string <Value>k__BackingField;
// Methods
public MyClass(string pName, string pValue)
{
base..ctor();
this.Name = pName;
this.Value = pValue;
return;
}
// Properties
public string Name
{
[CompilerGenerated]
get
{
string str;
str = this.<Name>k__BackingField;
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.<Name>k__BackingField = value;
return;
}
}
public string Value
{
[CompilerGenerated]
get
{
string str;
str = this.<Value>k__BackingField;
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.<Value>k__BackingField = value;
return;
}
}
}
观察一下构造函数,变成了
...
base..ctor();
this.Name = pName;
...
关键就在这里:对于类来讲,并不要求在访问类的实例之前对所有成员赋值,所以这里引用this是合法的;而值类型要求在使用前必须对所有成员赋值,所以值类型如果在构造函数中直接给自动属性赋值,这里this代表的就是结构本身,而在此之前自动生成的二个私有成员private string <Name>k__BackingField和private string <Value>k__BackingField还没赋值,因此报错也就是合情合理了
相关文章推荐
- 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类
- WifiDog实际应用注意的问题
- 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类
- 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类
- C++struct结构类型
- 结构类型(struct)与机器位数不同所占用的内存空间
- C# 中的结构类型(struct type)
- C#匿名类型的的实际应用
- Spring bean配置中属性值由String到实际类型的动态转化过程及PropertyEditor类的应用
- 迭代器-迭代对象-dir(a)可以查看该数据类型有多少种方法。range(10)在py3里就是一个迭代器,for循环实际就是迭代器的应用
- C#中的struct(结构)为值类型,struct类型全接触
- Linux下struct的成员对齐问题-结构体实际大小
- struct结构类型与typedef
- C++中struct也有构造函数与析构函数,也可以有访问类型控制以及结构体大小,类大小
- 在不能确定某一数据结构的结点是单一变量的情况下,结构的结点类型尽可能使用struct
- C#中的struct(结构)为值类型,struct类型全接触
- 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类
- 树结构的应用:表达式类型的实现
- swift的struct本节描述结构的类型
- c#基础 01.2 结构类型struct与类class的异同