重读C#高级编程之Struct在实际开发中的应用
首先看看struct和class区别和相同点.
1.最大的不同在于数据类型不同,前者为值类型,而后者为引用类型。
2.由于数据类型的不同,他们在内存中存储的位置也不同,前者存储在stack中,后者则Heap中;
3.由于存储位置不同,存取速度就有很大差距.stack中数据肯定heap中要快很多.
4.class支持接口继承,实例继承,而struct只支持接口继承.
...想不到了,先这样吧.
5.除此之外,他们大体相同:只是关键字不同而已.
所以,通常我们把Struct叫做轻量级数据结构,可以用来传输数据,此时比class要方便快捷很多.当然这里的数据应该是一些关联性比较强的一些数据,不然的话,就会很奇怪。
看一个Demo:
比如要把excel数据导入db中,通常我们会先把excel数据读出来,放在DataSet中,而后循环读取其中数据,执行insert语句...,而更糟的是,我们的数据访问是用web service实现的,那也就是说,程序会在短时间内频繁的访问server,调用web service,结果会怎么样哪?server会以为这个行为为攻击行为,Deny...
所以,对于批量的数据导入,通常要首先把数据“打包”,而后一次提交。
这个时候,struct就可以发挥作用了.
1.最大的不同在于数据类型不同,前者为值类型,而后者为引用类型。
2.由于数据类型的不同,他们在内存中存储的位置也不同,前者存储在stack中,后者则Heap中;
3.由于存储位置不同,存取速度就有很大差距.stack中数据肯定heap中要快很多.
4.class支持接口继承,实例继承,而struct只支持接口继承.
...想不到了,先这样吧.
5.除此之外,他们大体相同:只是关键字不同而已.
所以,通常我们把Struct叫做轻量级数据结构,可以用来传输数据,此时比class要方便快捷很多.当然这里的数据应该是一些关联性比较强的一些数据,不然的话,就会很奇怪。
看一个Demo:
class Class1
{
static void Main(string[] args)
{
int n=10;
myStruct[] structs=new myStruct[n];
for (int i = 0; i < n; i++)
{
structs[i].name = "ivan" + i;
structs[i].arrs = new string[] { "ss", "ddd" };
}
showData(structs);
}
private static void showData(myStruct[] mystructs)
{
for (int i = 0; i < mystructs.Length; i++)
{
Console.WriteLine(mystructs[i].name);
}
}
}
public struct myStruct
{
public string name;
public string[] arrs;
}
另外,还有一种情况,用struct十分方便:循环提交数据给数据库的情况。{
static void Main(string[] args)
{
int n=10;
myStruct[] structs=new myStruct[n];
for (int i = 0; i < n; i++)
{
structs[i].name = "ivan" + i;
structs[i].arrs = new string[] { "ss", "ddd" };
}
showData(structs);
}
private static void showData(myStruct[] mystructs)
{
for (int i = 0; i < mystructs.Length; i++)
{
Console.WriteLine(mystructs[i].name);
}
}
}
public struct myStruct
{
public string name;
public string[] arrs;
}
比如要把excel数据导入db中,通常我们会先把excel数据读出来,放在DataSet中,而后循环读取其中数据,执行insert语句...,而更糟的是,我们的数据访问是用web service实现的,那也就是说,程序会在短时间内频繁的访问server,调用web service,结果会怎么样哪?server会以为这个行为为攻击行为,Deny...
所以,对于批量的数据导入,通常要首先把数据“打包”,而后一次提交。
这个时候,struct就可以发挥作用了.
public struct MyInsert
{
public string TableName;
public string[] Fields;
public string[] FieldValues;
}
{
public string TableName;
public string[] Fields;
public string[] FieldValues;
}
MyInsert[] Inserts = new MyInsert [5];
for (int i = 0; i < 5; i++)
{
MyInsert dbInsert = new MyInsert();
dbInsert.TableName = "EXAMPLE";
dbInsert.Fields = new string[] { "ID", "NAME", "ADDRESS", "TEL" };
dbInsert.FieldValues = new string[] {
Guid.NewGuid().ToString(),
"JIA" + i.ToString(),
"SZ" +i.ToString(),
i.ToString()+"000"
};
Inserts[i] = dbInsert;
}
InsertAllData(Inserts);
而后在InsertAllData中对传递进来的Struct“解析”,执行操作。
for (int i = 0; i < 5; i++)
{
MyInsert dbInsert = new MyInsert();
dbInsert.TableName = "EXAMPLE";
dbInsert.Fields = new string[] { "ID", "NAME", "ADDRESS", "TEL" };
dbInsert.FieldValues = new string[] {
Guid.NewGuid().ToString(),
"JIA" + i.ToString(),
"SZ" +i.ToString(),
i.ToString()+"000"
};
Inserts[i] = dbInsert;
}
InsertAllData(Inserts);