库表中有Col_0,^Col10固定列 用DataTable赋值可以 tableRows["Col"+i] = i; 改为Mode不会!

求帮忙解决 ,拜谢 ,0 error(s), 0 warning(s)但是输不出来结果,_百度知道7004人阅读
DataTable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在编程过程中根据需要动态创建数据表。那么在8.4节中主要讲用编码的方式来建立DataTable数据表以及对它的操作。
1 代码创建DataTable数据表
如上8.3节里面所讲,通过添加对象的方式直接在DataSet中创建数据表,可以通过使用Add方法将DataTable添加到DataSet中,这种是使用控件的可视化添加DataTable的操作,那么在代码中怎么来创建DataTable数据表呢?
在程序中创建DataTable对象可以使用相应的DataTable构造函数。创建一个表名为TableName的数据表,实现代码如下所示:
DataTable NewTable = new DataTable(TableName);
另外也可以通过以下方法创建DataTable对象:使用DataAdapter对象的Fill方法或FillSchema方法在DataSet中创建,这种方式都用于与数据库相连接操作的情况下。实现代码如下所示:
//数据库联接字符串
string connectionString =
&Data Source=Initial Catalog=NIntegrated Security=TUserID=Password=&;
//sql语句查询
string commandString = &Select * from Customers&;
// 创建SqlDataAdapter对象,并执行sql命令
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);
//创建数据集dataSet
DataSet dataSet = new DataSet();
//把数据表添加到数据集中
DataTable dataTable = dataSet.Tables(&Customers&);
//将数据填充到数据集中
dataAdapter.Fill(dataSet,&Customers&);
注意:将一个DataTable作为成员添加到一个DataSet的Tables集合中后,不能再将其添加到任何其他DataSet的表集合中。
使用DataTable构造函数初次创建DataTable时,是没有架构(即结构,没有列)的。没有架构的DataTable数据表示没有办法使用的,因此要在使用这种DataTable数据表之前要定义表的架构,必须创建DataColumn对象并将其添加到表的Columns集合中。如何使用代码创建Columns列,将在本章后面几节中讲到。
创建DataTable时,不需要为TableName属性提供值,可以在其他时间指定该属性,或者将其保留为空,这些都不影响DataTable的使用。应该注意的是在将一个没有TableName值的表添加到DataSet中时,该表会得到一个从“Table”(表示Table0)开始递增的默认名称TableN。
以下示例创建DataTable对象的实例,并为其指定名称“Customers”。 实现代码如下所示:
DataTable workTable = new DataTable(&Customers&);
以下代码是将创建的DataTable实例Customers表添加到DataSet的Tables集合中。实现代码如下所示:
DataSet customers = new DataSet();
DataTable customersTable = customers.Tables.Add(&CustomersTable&);
DataSet customers = new DataSet();
DataTable customersTable = new DataTable(“Customers”)
customers.Tables.Add(Customers);
2 用编程方式添加DataTable列
前面已经学过使用代码创建DataTable,但是使用DataTable构造函数初次创建 DataTable时,是没有架构(即结构,没有列)的。要定义表的架构,必须创建DataColumn 对象并将其添加到表的Columns集合中。也可以为表定义主键列,并且可以创建Constraint约束对象并将其添加到表的Constraints约束集合中。
DataColumn类型表示了DataTable上的一列。总的来说,绑定到某个DataTable的所有DataColumn类型的集合就表示一个表。
DataTable包含了由表的Columns属性引用的DataColumn对象的集合。这个列的集合与任何约束一起定义表的架构(即结构)。
通过使用DataColumn构造函数,或者通过调用表的Columns属性的Add方法,可在表内创建DataColumn对象。Add方法将接受可选的ColumnName、DataType参数,并将创建新的DataColumn作为集合的成员。它还会接受现有的DataColumn对象并会将其添加到集合中,并会根据请求返回对所添加的DataColumn的引用。
以下示例向DataTable中添加了四列。实现代码如下所示:
DataTable workTable = new DataTable(&Customers&);
DataColumn workCol = workTable.Columns.Add(&CustID&);
workTable.Columns.Add(&CustLName&);
workTable.Columns.Add(&CustFName&);
workTable.Columns.Add(&Purchases&);
代码说明:
q&&&&&& CustID,CustLName,CustFName,Purchases:数据表Customers中的列名。
3 设置DataTable数据表的主键
数据库开发的一个通常规则就是表至少得有一个列作为主键。主键约束用于惟一标识给定表中的一条记录(行)。假设现在需要新建一个DataColumn列来表示EmpID字段并且要将这个列将作为表的主键,它必须有AllowDBNull和Unique属性,实现代码如下所示:
DataTable workTable = new DataTable(&Customers&);
DataColumn workCol = workTable.Columns.Add(&CustID&, typeof(Int32));
workCol.AllowDBNull =
workCol.Unique =
workTable.Columns.Add(&CustLName&, typeof(String));
workTable.Columns.Add(&CustFName&, typeof(String)));
workTable.Columns.Add(&Purchases&, typeof(String)));
代码说明:
示例中用于CustID列的属性设置为不允许DBNull值并将值约束为唯一。但是,如果将CustID列定义为表的主键列,AllowDBNull属性就会自动设置为false,并且Unique属性会自动设置为true。
4 设置列的数据类型
通过上面8.4.2节的学习已经知道怎么向新建的数据表中添加列了,那么下面来看一看,怎么为添加的列设置列的数据类型。数据类型是标明一列数据的数据类型属性,根据不同的需要可以在DataTable数据表中建立不同的列,并可以为不同的列设置不同的数据类型,来满足需要。继续上面Customers表的例子,为创建的列添加数据类型:
实现代码如下所示:
//创建一个数据表Customers
DataTable CustomersTable = new DataTable(&Customers&);
//创建一个Int32类型名称是CustID列,把这个列设置成主键,并且不允许为空,
DataColumn CustomersCol = CustomersTable.Columns.Add(&CustID&, typeof(Int32));
CustomersCol.AllowDBNull =
CustomersCol.Unique =
//创建三个String类型的列CustLName,CustFName,Purchases
CustomersTable.Columns.Add(&CustLName&, typeof(String));
CustomersTable.Columns.Add(&CustFName&, typeof(String)));
CustomersTable.Columns.Add(&Purchases&, typeof(String)));
代码说明:
示例中用于CustID列定义为表的主键列。CustID列指定的数据类型是Int32,CustLName列、CustFName列、Purchases列指定的数据类型都是String的列,当然也可以不设置列的数据类型,在这个时候DataColumn的DataType属性默认为字符串类型,当然可以根据需要在创建列名时进行列数据类型的设置。
5 启用Autoincrementing字段
在8.4.4节中学会了如何设置DataColumn列的数据类型,在设置完DataColumn列的数据类型以后,也可以像SQL-Server数据库表一样把某一列设置成自动递增的。简单地说,自动增加列可以确保当一个新行被添加到给定表时,可以基于当前的递增步长值自动指定这个列的值。特别是某一列作为没有重复值得主键的时候,这个功能就特别有用。在DataTable中这个功能可以用AutoIncrement(列是否将列的值自动递增)、AutoIncrementSeed(起始值,种子值)和AutoIncrementStep(步长)属性来控制。
下面是创建一个支持自动递增的DataColumn列的例子。种子值用于标记列的起始值,步长值表示递增时增加种子值的数值,代码如下所示:
// 创建一个新列
DataColumn myColumn = new DataColumn();
myColumn.ColumnName = & CustID &;
myColumn.DataType = System.Type.GetType(&System.Int32&);
&// 设置自动递增
myColumn.AutoIncrement =
myColumn.AutoIncrementSeed = 0;
myColumn.AutoIncrementStep = 1;
代码说明:
q&&&&&& AutoIncrement:列是否将列的值自动递增,true表示自动递增,false表示不能自动递增。
q&&&&&& AutoIncrementSeed:起始值种子值,AutoIncrement属性设置为true的列的起始值。
q&&&&&& AutoIncrementStep:步长,递增量,AutoIncrement属性设置为true的列的步长。
创建一个数据类型为Int32的CustID列,为了能使这个字段的值实现自动增加的效果,把列AutoIncrement属性设置为true;把列得种子值AutoIncrementSeed定为0,也就是从0开始计数;同时设置自动增加的步长AutoIncrementStep为1,每次增加一个。由于种子值被定为0,前面5个值应该是0、1、2、3和4。
可以往一个DataTable中添加这个DataColumn来测试一下。然后往这个表中添加一些新行,当然会自动转储CustID列中的值,代码如下所示:
//实现列自动增加功能
&&& protected void Button1_Click(object sender, EventArgs e)
&&&&&&& //创建一个新的数据列,名称:CustID ,数据类型:Int32.
&&&&&&& DataColumn myColumn = new DataColumn();
&&&&&&& myColumn.ColumnName = & CustID &;
&&&&&&& myColumn.DataType = System.Type.GetType(&System.Int32&);
&&&&&&& //把新创建的列设置自动增加,种子为0,增加步长为1.
&&&&&&& myColumn.AutoIncrement =
&&&&&&& myColumn.AutoIncrementSeed = 0;
&&&&&&& myColumn.AutoIncrementStep = 1;
&&&&&&& //把这个列添加到Customers表中.
&&&&&&& DataTable CustomersTable = new DataTable(&Customers&);
&&&&&&& myTable. CustomersTable.Add(myColumn);
&&&&&&& //添加20个新行.
&&&&&&& DataR
&&&&&&& for (int i = 0; i & 20; i++)
&&&&&&&&&&& r = CustomersTable.NewRow();
&&&&&&&&&&& CustomersTable.Rows.Add(r);
&&&&&&& //显示每一行的数据值.
&&&&&&& string temp = &&;
&&&&&&& DataRowCollection rows = CustomersTable.R
&&&&&&& for (int i = 0; i & CustomersTable.Rows.C i++)
&&&&&&&&&&& DataRow currRow = rows[i];
&&&&&&&&&&& temp += currRow[&CustID &] + & &;
&&&&&&&&&&& //在Label1面显示所有值
&&&&&&& Label1.Text = Label1.Text+
如果把上面代码写在建立的Web程序中,运行后点击“Button”按钮,就会得出初始值为0的步长为1的一系列数,结果如图:8.4.1所示的显示结果。
6 用编程方式添加DataTable行
在为DataTable定义了架构之后,也就是设置好了需要的列名以后,就可以可通过将DataRow对象添加到表的Rows集合中来将数据行添加到表中。与添加DataColumn类似,同样可以通过使用DataRow构造函数,或者通过调用表的Rows属性的Add方法,可在表内创建DataRow对象。
DataColumn对象集合表示了表的模式(Schema)。DataTable通过内部的DataColumnCollection类型保存表中所有列。相反,DataRow类型集合就表示表中的实际数据。这样,如果Customers表中有10个记录,就可以使用10个DataRow类型来表示它们。使用DataRow类的成员可以对表中的值进行插入、删除、求值和操作操作。
创建一个DataRow数据行的对象,实现代码如下所示:
//创建一个Customers数据表
DataTable CustomersTable = new DataTable(&Customers &);
//创建一个新的数据行
DataRow arow = CustomersTable.NewRow();
//设置行的值
arow[ColumnName] = DataV
//把数据行添加创建的Customers数据表中
CustomersTable.Rows.Add(arow);
功能说明:
新建一行arow, 并给这行某一个列名付值为DataValue,最后把这一行添加到Customers表中。使用DataRow与使用DataColumn有些不同,因为不可以直接创建这个类型的实例,而是获得一个来自给定DataTable的引用。例如,假设想往Customers表中添加新行,DataTable.NewRow()方法可以获得下一空位,然后在上面填充每列的数据。
实现代码如下所示:
//创建一个数据表
DataTable CustomersTable = new DataTable(&Customers&);
//声明数据表的行和列变量
//创建一个新列,设置列的数据列性和列名,并把这个新列添加到Customers表中
column=new DataColumn();
column.DataType = System.Type.GetType(&System.Int32&);
column.ColumnName = & CustID &;
CustomersTable.Columns.Add(column);
//再创建一个新列
column = new DataColumn();
column.DataType = Type.GetType(&System.String&);
column.ColumnName = & CustLName &;
CustomersTable.Columns.Add(column);
//创建新的一行并把这个行添加到Customers表中
for(int i = 0; i & 10; i++)
row = CustomersTable.NewRow();
row[&CustID &] =
row[&CustLName &] = &item & + i.ToString();
CustomersTable.Rows.Add(row);
功能说明:
向CustomersTable表创建两个列分别是CustID, CustLName,然后用循环的方式产生10行并附值,添加到CustomersTable表中。
7 操作DataTable:更新行
在前面一节里面讲了,怎么样添加一个DataRow行,那么下面需要了解的关于DataTable的另一个方面就是怎样用新值更新已有的DataRow行。下面开始介绍关于DataTable更新行的问题。
最常使用的一个方法就是先用Select()方法获得符合给定过滤条件的行。一旦获得这些DataRow,就对它们作相应的修改。例如,假定有一个新按钮在被单击后,搜索DataTable中所有EmployeeID列值为5的行。一旦标识这些项后,就可以把EmployeeID列对应值5改为6。实例代码如下:
//数据库联接字符串
string connectionString =
&Data Source=Initial Catalog=NIntegrated Security=TUserID=Password=&;
//sql语句把Orders表中的数据信息都取出来
string commandString = &Select * from Orders&;
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);
DataSet dataSet = new DataSet(& );
//填充数据集
dataAdapter.Fill(dataSet,& Orders&);
//填充数据表
DataTable dataTable = dataSet.Tables(&Orders&);
// 建立一个用于过滤出EmployeeID列值为5的行的行的变量
string filterStr = &EmployeeID=5&;
string strEmployeeID =
// 查询出来所有EmployeeID列值为5的行.
DataRow[] EmployeeID= dataTable.Select(filterStr);
// EmployeeID列对应值5改为6
for(int i = 0; i & EmployeeID.L i++)
DataRow temp = EmployeeID [i];
strEmployeeID += temp[&EmployeeID &] = 6;
EmployeeID [i] =
8 用编程方式删除DataTable行
用于从DataTable对象中删除DataRow对象的方法有两种:DataRowCollection对象的 Remove方法和DataRow对象的Delete方法。
Remove方法和Delete方法都可以将DataTable的行DataRow删除,但是前者是从DataRowCollection中删除DataRow,而后者只将行标记为删除。当应用程序调用AcceptChanges方法时,才会发生实际的删除。通过使用Delete,可以在实际删除之前先以编程方式检查哪些行标记为删除。如果将行标记为删除,其RowState属性会设置为Deleted。
在将DataSet或DataTable与DataAdapter和关系型数据源一起使用时,用DataRow的 Delete方法移除行。Delete方法只是在DataSet或DataTable中将行标记为Deleted,而不会移除它。而DataAdapter在遇到标记为Deleted的行时,会执行其DeleteCommand方法以在数据源中删除该行。然后,就可以用AcceptChanges方法永久移除该行。如果使用Remove 删除该行,则该行将从表中完全移除,但DataAdapter不会在数据源中删除该行。
DataRowCollection的Remove方法采用DataRow作为参数,并将其从集合中移除,实现代码如下所示:
DataTable CustomersTable = new DataTable(&Customers &);
DataRow workRow = empTable.NewRow();
CustomersTable.Rows.Remove(workRow);
作为对比,以下示例演示了如何调用DataRow上的Delete方法来将其RowState改为Deleted。实现代码如下所示:
DataTable CustomersTable = new DataTable(&Customers &);
DataRow workRow = empTable.NewRow();
workRow.Delete();
如果将行标记为删除,并且调用DataTable对象的AcceptChanges方法,该行就会从DataTable中移除。相比之下,如果调用RejectChanges,行的RowState就会恢复到被标记为Deleted之前的状态。
9 向DataTable填充数据
ADO.NET中的DataSet是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型。DataSet表示整个数据集,其中包含表、约束和表之间的关系。由于DataSet独立于数据源,DataSet可以包含应用程序本地的数据,也可以包含来自多个数据源的数据。与现有数据源的交互通过DataAdapter来控制。
DataAdapter的SelectCommand属性是一个Command对象,用于从数据源中检索数据。DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性也是Command对象,用于按照对DataSet中数据的修改来管理对数据源中数据的更新。
DataAdapter的Fill方法用于使用DataAdapter的SelectCommand的结果来填充DataSet。Fill将要填充的DataSet和DataTable对象(或要使用从SelectCommand中返回的行来填充的DataTable的名称)作为它的参数。
Fill方法使用DataReader对象来隐式地返回用于在DataSet中创建表的列名称和类型以及用于填充DataSet中的表行的数据。表和列仅在不存在时才创建;否则,Fill将使用现有的DataSet架构。
以下代码示例使用SqlDataAdapter对象获取Microsoft SQL Server Northwind数据库的数据填充到Customers数据集中的Customers表。
实现代码如下所示:
//使用DataAdapter的Fill方法向Customers表中填充数据
string connectionString =
&Data Source=Initial Catalog=NIntegrated Security=T UserID=Password=&;
string commandString = &Select * from Customers&;
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);
DataSet customers = new DataSet();
dataAdapter.Fill(customers, &Customers&);
10 在DataTable实现类似sql语句的查询功能
在脱离数据库的DataSet实现类似sql语句的查询。
也就是(select ... from tablename where ...)这样的功能。
将从DataSet中查询出来的数据以行的形式保存到arow中。
实现代码如下所示:
DataSet ds= new DataSet();
DataRow[] arow = ds.Tables[TableName].Select(&& + ColumnsName+ &=''& + DataValue + &''&);
代码说明:
qTableName:数据集ds中的表名。
qColumnsName:TableName表中的某一列名。
qDataValue:和列名对应参数的值。
功能说明:
上面语句功能相当于sql语句中的查询语句
Select * From TableName where ColumnsName= DataValue
11& DataTable中数据记录的统计
在使用数据库时例如SQL-Server、Oracle这些数据库,可以轻松的通过统计和计算函数例如Sum、Aver、Count等统计或计算出相关结果,那么,在已经把数据检索出来的DataTable数据集中能否同样使用呢?在程序中根据需要动态创建的DataTable是没有办法使用sql语句进行查询统计的,例如没有办法使用Select语句来获取查询统计结果。那么在DataTable中怎么来进行统计呢?
&&& 本节将介绍一个简单的方法,可以轻松的获得DataTable中的记录统计结果。这个简单的方法就是调用功能强大的DataTable的函数Compute。
函数如下:
public object Compute(string expression,string filter)
参数说明:
qexpression 参数需要聚合函数,要计算的表达式字符串,基本上类似于Sql Server中的统计表达式。例如,以下是合法表达式:Count(ID)。
qfilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计,也就是确定在表达式中使用哪些行。
&&& 以下示例,以SQL-Server数据库中的Northwind数据库中的Orders数据表,描述订单信息,包含字段为:订单号(OrderID)、客户编号(CustomerID)、职工编号(EmployeeID)、订货时间(OrderDate)、船号(ShipVia)、运费(Freight)。
1.统计所有职工编号EmployeeID为5的数量:
pute(&Count(*)&,&EmployeeID=5&);
2.统计所有运费Freight中运费大于100的个数
pute(&Count(*)&,&Freight&100''&);
3.统计运费Freight的平均值
pute(&Aver(Freight)&,&true&);
4.统计职工编号EmployeeID为5的运费总额:
pute(&Sum(Freight)&,& EmployeeID=5&);
以上都是计算每一列的合计,那么要添加一行求合计可以使用下面的方法:
//创建一个数据集
DataSet customers = new DataSet();
//在数据集中添加一个名称为CustomersTable的数据表
DataTable customersTable = customers.Tables.Add(&CustomersTable&);
//创建一个新行并添加到CustomersTable数据表中
DataRow dataRow = new DataRow();
dataRow= customersTable.NewRow();
//然后就是统计了,声明连个int 变量i:循环变量, colCnt: customersTable表中的列数
colCnt = customersTable.Cols.C
for( i=0 ;i& colCnt -1;i++)
//求第i列的和并且结果赋值给新的dataRow数据行
dataRow(i)= pute(&Sum(&+i.ToString()+&)&,&true&);
//把数据行添加到customersTable数据表中
customersTable.Rows.Add(dataRow);
12 DataTable和xml的一些应用总结
在ASP.NET2.0中ADO.NET和XML结合的很紧密,第7章中已经详细介绍了在ADO.NET中的数据通过DataSet很容易存取在XML中的,那么在DataTable能像在DataSet中那样操作XML数据文件吗?答案是可以的,下面就是一个将DataTable中的数据写入到XML文件中去的操作,实例代码如下所示:
//创建一个Customers数据表
DataTable dt = new DataTable(&Customers&);
//添加两列CustID,CustLName数据类型分别为Int32,String,并添加到数据表中
DataColumn dc1 = new DataColumn(&CustID&, Type.GetType(&System.Int32&));
DataColumn dc2 = new DataColumn(&CustLName&, Type.GetType(&System.String&));
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
//利用循环创建数据行并赋值,添加到数据表中
for (int i = 0; i & al.C i++)
DataRow dr = dt.NewRow();
DS_Option dso = (DS_Option)al[i];
dr[&CustID&] = dso.ID;
dr[&CustLName&] = dso.N
dt.Rows.Add(dr);
//将数据表中的数据写入到XML文件中
System.IO.StringWriter writer = new System.IO.StringWriter();
dt.WriteXml(writer);
xmlstr = writer.ToString();
有了向XML文件写数据的操作,当然也可以从XML文件中读取数据信息到DataTable数据表中,方法累也类似,但要先建立好打DataTable的结构,不然会出错。
实例代码如下所示:
string tbxml =
DataTable dt = new DataTable(&Customers &);
DataColumn dc1 = new DataColumn(&CustID&, Type.GetType(&System.Int32&));
DataColumn dc2 = new DataColumn(&CustLName&, Type.GetType(&System.String&));
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
System.IO.StringReader reader = new System.IO.StringReader(tbxml);
dt.ReadXml(reader);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:47369次
排名:千里之外
转载:46篇
(1)(1)(4)(4)(3)(16)(9)(11)今天看啥 热点:
C#开发规范总结,第1章程序的版式
版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。
可以把程序的版式比喻为"书法"。好的"书法"可让人对程序一目了然,看得兴致勃勃。差的程序"书法"如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。
1.1&版本和版权声明
版本和版权的声明写在文件的开头,包含内容如下:
1、版权信息
3、当前版本
5、修改作者
6、完成日期
7、版本历史信息
///&copyright&&Copyright (c) 2006,有限公司&/copyright&
///&copyright&&All rights reserved.&/copyright&
///&abstract&描述文件的内容,实现的功能和算法等内容&/abstract&
///&current_version&当前版本&/current_version&
///&author&作者&/author&
///&finish_date&完成日期&/finish_date&
///&replace_version&取代版本&/replace_version&
///&modify&修改&/modify&
///&modify_author&修改作者&/modify_author&
///&modify_date&修改日期&/modify_date&
版本版权声明示例
在C#中代码注释这样写的好处是Visual Stuidio能够在编译的时候自动生成xml格式的注释文档。
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。
在每个类声明之后、每个函数定义结束之后都要加空行。参见示例1-2(a)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例1-2(b&)
void Function1(&)
void Function2(&)
void Function3(&)
while (condition)
&&& statement1;
&&& //&空行
&&& if (condition)
&&&&&&& statement2;
&&&&&&& statement3;
&&& statement4;
示例1-2(a)&函数之间的空行&&&&&&&&&&&&&&&&&&示例1-2(b)&函数内部的空行
1.3&代码行
(1)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
(2)if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
示例1-3(a)为风格良好的代码行,示例1-3(b)为风格不良的代码行。
int width, height,
&//&宽度高度深度
X&=&a +&& y = c +&z = e +
if (width & height)
dosomething();
if (width & height) dosomething();&
for ( update)
dosomething();
for ( update)
&&&& dosomething();
示例1-3(a)&风格良好的代码行&&&&&&&&&&&&&&&&示例1-3(b)&风格不良的代码行
【建议】尽可能在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。例如
int width = 10; &&& //&定义并初绐化width
int height = 10;&&& //&定义并初绐化height
int depth = 10; &&& //&定义并初绐化depth
1.4&代码行内的空格
(1)关键字之后要留空格。象const、case&等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号'(',以突出关键字。
(2)函数名之后不要留空格,紧跟左括号'(',以与关键字区别。
(3)'('向后紧跟,')'、','、';'向前紧跟,紧跟处不留空格。
(4)','之后要留空格,如Function(x, y, z)。如果';'不是一行的结束符号,其后要留空格,如for ( update)。
(5)赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" "&="、"&="、"+"、"*"、"%"、"&&"、"||"、"&&","^"等二元操作符的前后应当加空格。
(6)一元操作符如"!"、"~"、"++"、"--"、"&"(地址运算符)等前后不加空格。
(7)象"[]"、"."、"-&"这类操作符前后不加空格。
(8)对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i&10; i++)和if ((a&=b) && (c&=d))
示例1-4&代码行内的空格
void Func1(int x, int y, int z)&
void Func1 (int x,int y,int z)&
if (year &= 2000)&
if(year&=2000)&
if ((a&=b) && (c&=d))&
if(a&=b&&c&=d)&
for (i=0; i&10; i++)&&&&
for(i=0;i&10;i++)
x = a & b ? a :&&
x=a&b?a:b;&&&&
示例1-4(a)&风格良好的代码行&&&&&&&&&&&&&&&&示例1-4(b)&风格不良的代码行
(1)程序的分界符'{'和'}'应独占一行并且位于同一列,同时与引用它们的语句左对齐。
(2){ }之内的代码块在'{'右边数格处左对齐。
void Function(int x)
& // program code
void Function(int x){
& // program code
if (condition)
& // program code
& // program code
if (condition){
& // program code
& // program code
for ( update)
& // program code
for ( update){
& // program code
While (condition)
& // program code
while (condition){
& // program code
如果出现嵌套的{},则使用缩进对齐,如:
&&&&&&& &{
&&&&&&& &&&
&&&&&&& &}
示例1-5(a)&风格良好的对齐&&&&&&&&&&&&&&&&&&&&&&示例1-5(b)&风格不良的对齐
1.6长行拆分
代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
if ((very_longer_variable1 &= very_longer_variable12)
&& (very_longer_variable3 &= very_longer_variable14)
&& (very_longer_variable5 &= very_longer_variable16))
&&& dosomething();
for (very_longer_
&&& &very_longer_
&&& &very_longer_update)
&&& dosomething();
示例1-6&长行的拆分
C#语言中,程序块的注释常采用"/*&*/",行注释一般采用"//&"。注释通常用于:
(1)版本、版权声明;
(2)函数接口说明;
(3)重要的代码行或段落提示。
(4)&虽然注释有助于理解代码,但注意不可过多地使用注释。
(5)注释是对代码的"提示",而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。注释的花样要少。
(6)如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。例如
i++; &// i&加&1,多余的注释
(7)边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
(8)注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。
(9)尽量避免在注释中使用缩写,特别是不常用缩写。
(10)注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
(11)当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
*&函数介绍:
*&输入参数:
*&输出参数:
*&返回值&:
void Function(float x, float y, float z)
&while (&)
} // end of while
} // end of if&
示例1-7&程序的注释
第2章命名规则
所有标识符的命名必须遵循如下三种大小写规范进行命名:
Pascal&大小写
首字母大写,且后续单词的首字母都必须大写;
本规则一般用于三个或更多字母的标识&的情况
&BackColor
Camel&大小写
首字母小写,且后续单词的首字母都必须大写;
本规则仅用于函数参数和保护实例成员的命名中
&backColor
所有字母都必须大写
本规则仅用于标识只有两个或更少字母的情况
&System.IO
&System.Web.UI
2.1&&&大小写规则
大写标识符中的所有字母都大写。仅对于由两个或者更少字母组成的标识符使用该约定。例如:
System.Web.UI
下表汇总了大写规则,并提供了不同类型的标识符的示例。
AppDomain&
ErrorLevel&
FatalError&
ValueChange&
WebException
注意总是以&Exception&后缀结尾。
只读的静态字段
IDisposable
注意总是以&I&前缀开始。
System.Drawing&
BackColor&
公共实例字段
注意很少使用。属性优于使用公共实例字段。
受保护的实例字段
注意很少使用。属性优于使用受保护的实例字段。
私有的实例字段
方法内的变量
backColor&
&为了避免混淆和保证跨语言交互操作,请遵循有关区缩写的使用的下列规则:
(1)&不要将缩写或缩略形式用作标识符名称的组成部分。例如,使用&GetWindow,而不要使用&GetWin。
(2)&不要使用计算机领域中未被普遍接受的缩写。
(3)&在适当的时候,使用众所周知的缩写替换冗长的词组名称。例如,用&UI&作为&User Interface&缩写,用&OLAP&作为&On-line Analytical Processing&的缩写。
(4)&在使用缩写时,对于超过两个字符长度的缩写请使用&Pascal&大小写或&Camel&大写。例如,使用&HtmlButton&或HTMLButton。但是,应当大写仅有两个字符的缩写,如,System.IO,而不是&System.Io。
(5)&不要在标识符或参数名称中使用缩写。如果必须使用缩写,对于由多于两个字符所组成的缩写请使用Camel&大小写,虽然这和单词的标准缩写相冲突。
2.3命名空间
(1)&命名命名空间时的一般性规则是使用公司名称,后跟技术名称和可选的功能与设计,如下所示。
&&&&&&&&CompanyName.TechnologyName[.Feature][.Design]
&& &&&&&例如:
&&&&&& &&namespace Langchao.Procurement&&&&&&&&&&&&
&&&&&& &&namespace Langchao.Procurement.DataRules&
(2)&命名空间使用Pascal大小写,用逗号分隔开。
(3)&TechnologyName&指的是该项目的英文缩写,或软件名。(4)&命名空间和类不能使用同样的名字。例如,有一个类被命名为Debug后,就不要再&&&&&&&&&
&&&&&&使用Debug作为一个名称空间名。
(1)&使用&Pascal&大小写。
(2)&用名词或名词短语命名类。
(3)&使用全称避免缩写,除非缩写已是一种公认的约定,如URL、HTML&&&
(4) &不要使用类型前缀。例如,使用类名称&FileStream
(5)&不要使用下划线字符&(_)。
(6)&有时候需要提供以字母&I&开始的类名称,虽然该类不是接口。只要&I&是作为类名称组成部分的整个单词的第一个字母,这便是适当的。例如,类名称&IdentityStore&是适当的。在适当的地方,使用复合单词命名派生的类。派生类名称的第二个部分应当是基类的名称。例如,ApplicationException&对于从名为&Exception&的类派生的类是适当的名称,原因ApplicationException&是一种Exception。请在应用该规则时进行合理的判断。例如,Button&对于从&Control&派生的类是适当的名称。尽管按钮是一种控件,但是将&Control&作为类名称的一部分将使名称不必要地加长。
&&&&&&&&public class FileStream
&&&&&&& public class Button
public class String
以下规则概述接口的命名指南:
(1)&用名词或名词短语,或者描述行为的形容词命名接口。例如,接口名称&IComponent&使用描述性名词。接口名称ICustomAttributeProvider&使用名词短语。名称&IPersistable&使用形容词。
(2)&使用&Pascal&大小写。
&(3)&少用缩写。
(4)&给接口名称加上字母&I&前缀,以指示该类型为接口。在定义类/接口对(其中类是接口的标准实现)时使用相似的名称。两个名称的区别应该只是接口名称上有字母&I&前缀。
(5)&不要使用下划线字符&(_)。
(6)&当类是接口的标准执行时,定义这一对类/接口组合就要使用相似的名称。两个名称的不同之处只是接口名前有一个I前缀。
&&&&&&&&&&以下是正确命名的接口的示例。
&&&&&&&&&&&&&&&&public interface IServiceProvider
&&&&&&&&&&&&&&& public interface IFormatable
&&&&&& &以下代码示例阐释如何定义&IComponent&接口及其标准实现&Component&类。
&&&&&&&&&&&&&&&public interface IComponent
&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&& // Implementation code goes here.
&&&&&&&&&&&&&& }
&&&&&&&&&&&&&& &
&&&&&&&&&&&&&& public class Component: IComponent
&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&& // Implementation code goes here.
2.6属性 (Attribute)
应该总是将后缀&Attribute&添加到自定义属性类。以下是正确命名的属性类的示例。
&&&&&&&&&&public class ObsoleteAttribute
&&&&&&&&& {
2.7枚举 (Enum)
枚举&(Enum)&值类型从&Enum&类继承。以下规则概述枚举的命名指南:
&(1)&对于&Enum&类型和值名称使用&Pascal&大小写。
&(2)&少用缩写。
&(3)&不要在&Enum&类型名称上使用&Enum&后缀。
&(4)&对大多数&Enum&类型使用单数名称,但是对作为位域的&Enum&类型使用复数名称。
&(5)&总是将&FlagsAttribute&添加到位域&Enum&类型。
以下规则概述参数的命名指南:
&& (1)&使用描述性参数名称。参数名称应当具有足够的描述性,以便参数的名称及其类型
可用于在大多数情况下确定它的含义。
(2)&对参数名称使用&Camel&大小写。
&& (3)&使用描述参数的含义的名称,而不要使用描述参数的类型的名称。开发工具将提
供有关参数的类型的有意义的信息。因此,通过描述意义,可以更好地使用参
数的名称。少用基于类型的参数名称,仅在适合使用它们的地方使用它们。
&&(4)&不要使用保留的参数。保留的参数是专用参数,如果需要,可以在未来的版本中公
开它们。相反,如果在类库的未来版本中需要更多的数据,请为方法添加新的重载。
(5)&不要给参数名称加匈牙利语类型表示法的前缀。
&&&以下是正确命名的参数的示例。
&&& &&&&Type GetType(string typeName)
string Format(string format, args() As object)
&&以下规则概述方法的命名指南:
&(1)&使用动词或动词短语命名方法。
&(2)&使用&Pascal&大小写。
&&(3)&以下是正确命名的方法的实例。
&&&&&&&&&&&&&&RemoveAll()
&&&&&&&&&&&&& GetCharArray()
2.10&属性 (property)
&以下规则概述属性的命名指南:
(1)&使用名词或名词短语命名属性。
(2)&使用&Pascal&大小写。
&(3)&不要使用匈牙利语表示法。
(4)&考虑用与属性的基础类型相同的名称创建属性。例如,如果声明名为&Color&的属性,则属性的类型同样应该是&Color。请参阅本主题中后面的示例。
&以下代码示例阐释正确的属性命名。
&&&&&&&&&&&&&&&&public class SampleClass
&&&& &&&&&&&&&&&&{
&&&&&&& &&&&&&&&&&&&&&public Color BackColor
&&&&&&&&&&&& &&&&&&&&&{
&&&&&&&&&&&&&&& &&&&&&&&&&&// Code for Get and Set accessors goes here.
&&&&&&&&&&&&&&&&& &&&&&}
&&&&&&&&&&&&& &&&&}
&&&&&&&& &&以下代码示例阐释提供其名称与类型相同的属性。
&&&&&&&&&&&&&&&&&public enum Color
&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&& // Insert code for Enum here.
&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& &&public class Control
&&&&&&&&&&&&&&&& &&&&&&public Color Color
&&&&&&&&&&&&&&&&&&&& &&{
// Insert code here.
// Insert code here.
&&&&&&&&&&&&&&&&&&&& &&&}
&&&&&&&&&&&&&&&&& &}
&&&&&&&&&&&以下代码示例不正确,原因是&Color&属性是&Integer&类型的。
&&&&&&&&&&&&&&&&public enum Color
// Insert code for Enum here.
&&&&&&&&&&&&&&& public class Control
&& &&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&& public int Color
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& // Insert code here
&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&在不正确的示例中,不可能引用&Color&枚举的成员。Color.Xxx&将被解释为访问一个成员,
该成员首先获取&Color&属性(&C#&中为&int&类型)的值,然后再访问该值的某个成员(该成
员必须是&System.Int32&的实例成员)。
&以下规则概述事件的命名指南:
&& (1)&对事件处理程序名称使用&EventHandler&后缀。
(2)&指定两个名为&sender&和&e&的参数。sender&参数表示引发事件的对象。sender&参数始终是object&类型的,即使在可以使用更为特定的类型时也如此。与事件相关联的状态封装在名为&e&的事件类的实例中。对&e&参数类型使用适当而特定的事件类。
(3)&用&EventArgs&后缀命名事件参数类。
(4)&考虑用动词命名事件。
(5)&使用动名词(动词的"ing"形式)创建表示事件前的概念的事件名称,用过去式表示事件后。例如,可以取消的&Close&事件应当具有&Closing&事件和&Closed&事件。不要使用BeforeXxx/AfterXxx&命名模式。
&& (6)&不要在类型的事件声明上使用前缀或者后缀。例如,使用&Close,而不要使用&OnClose。
(7)&通常情况下,对于可以在派生类中重写的事件,应在类型上提供一个受保护的方法(称为OnXxx)。此方法只应具有事件参数e,因为发送方总是类型的实例。
&以下示例阐释具有适当名称和参数的事件处理程序。
&&&&public delegate void MouseEventHandler(object sender, MouseEventArgs e);
&&&&&&以下示例阐释正确命名的事件参数类。
&&&&&&&&&&&&&&&&public class MouseEventArgs : EventArgs
&&&&&&&&& &&&&&&{
&&&&&&&&&&&& &&&&&&
&&&&&&&&&&&&&&
&&& &&&&&&&&&&&&&&public MouseEventArgs(int x, int y)
&&&&&&&&& &&&&&&&&{
&&&&&&&&&&&&&&& &&public int X
&&&&&&&&&&&&&&& &&{
&&&&&&&&&&&&&&&&& &&&&get
&&&&&&&&&&&&&&&&&&& &&{
&&&&&&&&&&&&&&&&&&&&& &&&&
&&&&&&&&&&&&&&&&&&& &&}
&&&&&&&&&&&&&& &&&}
&&&&&&&&&&&&&& &&&public int Y
&&&&&&&&&&&&&& &&&{
&&&&&&&&&&&&&&&& get
&&&&& &&&&&&&&&&&&&&&&&{
&&&&&&&&& &&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& &&&&&&&&&}
&&&&&&&&&&&&&& &&&}
&&&&&&&&&& &&&&&}
2.12&常量 (const)
&以下规则概述常量的命名指南:
&&&&&所有单词大写,多个单词之间用&"_"&隔开。如
&&&&&&&&&&&& &&&&public const string PAGE_TITLE = "Welcome";
&以下规则概述字段的命名指南:
&&&& &(1) private、protected&使用&Camel&大小写。
&&&&& (2) public&使用&Pascal&大小写。
(3)&拼写出字段名称中使用的所有单词。仅在开发人员一般都能理解时使用缩写。字段名称不要使用大写字母。下面是正确命名的字段的示例。
&&&&&&&&&&& &&&&class SampleClass
&&&&&&&&&&& &&&&{
&&&&&&&&&&& &&&&&&&&
&&&&&&&&&& &&string destinationU
&&&&& (4)&不要对字段名使用匈牙利语表示法。好的名称描述语义,而非类型。
(5)&不要对字段名或静态字段名应用前缀。具体说来,不要对字段名称应用前缀来区分静态和非静态字段。例如,应用&g_&或s_&前缀是不正确的。
(6)对预定义对象实例使用公共静态只读字段。如果存在对象的预定义实例,则将它们声明为对象本身的公共静态只读字段。使用&Pascal&大小写,原因是字段是公共的。下面的代码示例阐释公共静态只读字段的正确使用。
&&&&&&&&&&&&& &&&&public struct Color
&&&&&&&&&&&&& &&&&{
&&&&&&&&&&&&&&&& &&&&&public static readonly Color Red = new Color(0x0000FF);
&&&&&&&&&&&&&&&& &&&&&public Color(int rgb)
&// Insert code here.}
&&&&&&&& &&&&&&&&&&&&&&&&&public Color(byte r, byte g, byte b)
&&&&&&&& &&&&&&&&&&&&&&&&&{
// Insert code here.
&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&& &&&&&&&&&&&&&&&&&public byte RedValue
&&&& &&&&&&&&&&&&&&&&&{
&&&&&&&&& &&&&&&&&&&&&&&&&&get
&&&&&&&&&&&&&& &&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&return C
&&&&&&&&&&&&&&&&&&&&& &&&&&}
&&&&&&&&&&&&&&&&&& &&&&}
&&&&&&&&&&&&&& &&&&}
2.14&静态字段
&&以下规则概述静态字段的命名指南:
&&&& &(1)&使用名词、名词短语或者名词的缩写命名静态字段。
&&&&& (2)&使用&Pascal&大小写。
&&&&& (3)&对静态字段名称使用匈牙利语表示法前缀。
&&&&& (4)&建议尽可能使用静态属性而不是公共静态字段。
集合是一组组合在一起的类似的类型化对象,如哈希表、查询、堆栈、字典和列表,集合的命名
建议用复数。
第3章表达式和基本语句
3.1&运算符的优先级
C#语言的运算符有数十个,运算符的优先级与结合律如表3-1所示。注意一元运算符&+&-&*&的优先级高于对应的二元运算符。
( )&[ ]&-&&.&
!&~&++&--&(类型)&sizeof
&&& &=&& &&&=&
=&+=&-=&*=&/=&%=&&=&^=
|=&&&=&&&=&
表3-1&运算符的优先级与结合律
??如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。例如:
word = (high && 8) | low
if ((a | b) && (a & c))
3.2&复合表达式
如&a = b = c = 0这样的表达式称为复合表达式。允许复合表达式存在的理由是:(1)书写简洁;(2)可以提高编译效率。但要防止滥用复合表达式。
??(1)不要编写太复杂的复合表达式。
&&& i = a &= b && c & d && c + f &= g + //&复合表达式过于复杂
??(2)不要有多用途的复合表达式。
d = (a = b + c) +
该表达式既求a值又求d值。应该拆分为两个独立的语句:
??(3)不要把程序中的复合表达式与"真正的数学表达式"混淆。
if (a & b & c)&&&&&&&&& // a & b & c是数学表达式而不是程序表达式
并不表示&&&
if ((a&b) && (b&c))
而是成了令人费解的
if ( (a&b)&c )
3.3 if&语句
if语句是c#&语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以"与零值比较"为例,展开讨论。
3.3.1&布尔变量与零值比较
??&不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。
根据布尔类型的语义,零值为"假"(记为FALSE),任何非零值都是"真"(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如&c#将TRUE定义为1,而Visual Basic.net则将TRUE定义为-1。
假设布尔变量名字为flag,它与零值比较的标准if语句如下:
if (flag)&& //&表示flag为真
if (!flag)&//&表示flag为假
其它的用法都属于不良风格,例如:
&&& if (flag == TRUE)&&
&&& if (flag == 1 ) &&&
&&& if (flag == FALSE) &
&&& if (flag == 0)&&&&
3.3.2&整型变量与零值比较
??应当将整型变量用"=="或"!="直接与0比较。
&&&&假设整型变量的名字为value,它与零值比较的标准if语句如下:
if (value == 0) &
if (value != 0)
不可模仿布尔变量的风格而写成
if (value)&&&&& //&会让人误解&value是布尔变量
if (!value)
3.3.3&浮点变量与零值比较
??不可将浮点变量用"=="或"!="与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用"=="或"!="与数字比较,应该设法转化成"&="或"&="形式。
&&&&假设浮点变量的名字为x,应当将&&
if (x == 0.0) && //&隐含错误的比较
if ((x&=-EPSINON) && (x&=EPSINON))
其中EPSINON是允许的误差(即精度)。
3.4&循环语句的效率
C#&循环语句中,for语句使用频率最高,while语句其次,do语句很少用。提高循环体效率的基本办法是降低循环体的复杂性。
??(1)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如示例3-4(b)的效率比示例3-4(a)的高。
for (row=0; row&100; row++)
for ( col=0; col&5; col++ )
sum = sum + a[row][col];
for (col=0; col&5; col++ )
for (row=0; row&100; row++)
&&& sum = sum + a[row][col];
示例3-4(a)&低效率:长循环在最外层&&&&& &&&&&示例3-4(b)&高效率:长循环在最内层
??(2)&如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。示例3-4(c)的程序比示例3-4(d)多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环"流水线"作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用示例3-4(d)的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例3-4(c)的写法比较好,因为程序更加简洁。
for (i=0; i&N; i++)
if (condition)
&& &&&&&DoSomething();
&& &&DoOtherthing();
if (condition)
for (i=0; i&N; i++)
&&& DoSomething();
&&& for (i=0; i&N; i++)
&&& DoOtherthing();
表3-4(c)&效率低但程序简洁&&&&& &&&&&&&&&&表3-4(d)&效率高但程序不简洁
3.5 for&语句的循环控制变量
??(1)不可在for&循环体内修改循环变量,防止for&循环失去控制。
??(2)建议for语句的循环控制变量的取值采用"半开半闭区间"写法。
示例3-5(a)中的x值属于半开半闭区间"0 =& x & N",起点到终点的间隔为N,循环次数为N。
示例3-5(b)中的x值属于闭区间"0 =& x &= N-1",起点到终点的间隔为N-1,循环次数为N。
相比之下,示例3-5(a)的写法更加直观,尽管两者的功能是相同的。
for (int x=0; x&N; x++)
for (int x=0; x&=N-1; x++)
示例3-5(a)&循环变量属于半开半闭区间&&&&& &&&&&示例3-5(b)&循环变量属于闭区间
3.6 switch语句
switch是多分支选择语句,而if语句只有两个分支可供选择。虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。这是switch语句存在的理由。
&&& switch语句的基本格式是:
switch (variable)
case value1 : &&
case value2 : &&
default :&&
??(1)每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
??(2)不要忘记最后那个default分支。即使程序真的不需要default处理,也应该保留语句&default :&这样做并非多此一举,而是为了防止别人误以为你忘了default处理。
第4章&Asp.net设计规范
本界面设计规范适用于Asp.net开发的所有页面。
5.1&页眉、页脚和样式表
??在主窗口中显示的所有页面应该包含相同的页眉文件、页脚文件和样式表
??在单独窗口中显示的页面应该包含和主窗口页面一致的样式表
??页面元素的样式应该在单独的样式表中定义,而非直接在页面中定义各种属性
5.2页面标题
??在单独窗体中呈现的页面应该定义&title&元素,title必须能够表达界面的功能
5.3&窗口大小和位置
??弹出的新窗口应在屏幕上处于居中位置,如top=200,left=300
??页面元素的宽度应尽量使用百分比而避免直接使用像素值,应当保证页面在800x600满屏的窗口中显示时不用横向移动滚动条
??链接到系统内部页面的超链接使用相对路径
??含义相同的按钮名称应保持一致,如"确定"、"取消"、"重置"、&"搜索"、"高级搜索"、"新建"、"删除"、"更改"等
??多于一个的按钮并排摆放时顺序(左右/上下)应保持一致,如"确定"应该在"取消"的左边
5.6处理结果
??每次处理都应该有相应的处理结果页面或提示信息,不管该处理是成功还是失败
??相同处理结果的用语应保持一致,如避免同时使用"失败"和"没有成功"这样意义相同的词语
5.7&操作确认
??当用户在进行一些诸如删除,查封,导入,导出等会对系统造成影响的操作的时候,系统必须用确认框或者确认页面来提醒用户,并且让用户进行确认。
??任何一个操作页面,都必须提供给用户取消操作,并且返回的功能。
5.8&数据验证
??各个功能页面,系统都必须进行严格的数据验证,包括长度,类型,是否合法等等
??在asp.net中所有的数据验证都使用validator控件在客户端实现。
5.9控件使用
在asp.net中,dot net framework提供了WebControls和HtmlControls两种控件,但是两种控件有本质的区别,WebControls是服务器端的控件,服务器在执行的时候需要保留相应控件的状态等信息,HtmlControls是和Html相关的控件,使用原则如下
??所有需要服务器端进行事件响应的使用WebControl
??无需服务器端相响应的比如超连接,图片等等尽量使用HtmlControls这样可以提高效率,减少服务器的负担,减少网络传输的数据量。
5.10&视图状态
Asp.net中每个页面对象在输出html结束之后,页面对象将会被垃圾回收线程给回收掉,为了保存页面中各个WebControls的状态,系统会自动将各个WebControl里面的数据,状态等信息保存在ViewState中,这样就极大地加大了文件的大小,为了减少页面下载的量,试图状态的使用原则如下:
??在页面中判断Page.IsPostBack属性,将少对象初始化的量。
??将一些无需保留数据WebControls的EnableViewState改为false
5.11&异常处理
??在各个模块的类库中,如果有异常出现则首先将异常写到日志文件中,同时将异常抛出
??在页面上尽可能的将所有从封装的类中抛出来的异常抓起来,并且给用户比较友好的提示
??当出现非常严重的异常时将页面重定向到errorpage中。
5.12 HTML页面中需要注意的地方
??去掉页面中所有的&font&标签,因为在html标准4.0的时候这个tag就已经不建议使用了。
??为页面添加正确的DOCTYPE,DOCTYPE是document type的简写。主要用来说明你用的XHTML或者HTML是什么版本。
??设定一个命名空间,一个namespace是收集元素类型和属性名字的一个详细的DTD,namespace声明允许你通过一个在线地址指向来识别你的namespace。
??声明编码语言(&meta http-equiv="Content-Type" content="text/ charset=GB2312" /&)。
??用小写字母写所有的标签。
??为图片添加alt属性。
??给所有的属性添加引号
??关闭所有的标签,及时是&br&也应该写成&br /&。
??所有和显示显示相关的控制用css来控制。
??给每一个表格或者表单赋予一个唯一的ID。
5.13&数据库访问
??在页面文件中不要出现任何访问数据库的代码
??访问数据库的方式,推荐方式2
??方式1,通过字符串拼接来生成一个完整的SQL语句,如下
SqlConnection objDbConn = new SqlConnection("链接字符串");
String strSql = "select * from TUSER_USERINFO where UserID=" + strUserID;
SqlCommand objCommand = new Command(strSql,objDbConn);
SqlDataReader objReader = objCommand.ExecuteReader();
缺陷:SQL Injection漏洞
??方式2,通过参数来实现
SqlConnection objDbConn = new SqlConnection("链接字符串");
String strSql = "select * from TUSER_USERINFO where UserID=@UserID";
SqlCommand objCommand = new Command(strSql,objDbConn);
objCommand.Paramters.Add("@UserID",strUserID);
SqlDataReader objReader = objCommand.ExecuteReader();
系统将调用Ms SQLServer2000中的sp_executesql存储过程来实现,能够避免漏洞
第5章&javascript编写规范
6.1&在什么地方插入 JavaScript
一种方法,JavaScript&出现在&HTML&的head&部分,使用标记&script&&&/script&。
另外一种插入&JavaScript&的方法,是把&JavaScript&代码写到另一个文件当中(此文件通常应该用".js"作扩展名),然后用格式为"&script src="javascript.js"&&/script&"的标记把它嵌入到文档中。注意,一定要用"&/script&"标记。
6.2 JavaScript&中的变量
变量的命名有以下要求:只包含字母、数字和/或下划线;要以字母开头;不能太长不能与&JavaScript&保留字(Key Words,Reserved Words,数量繁多,不能一一列出;凡是可以用来做&JavaScript&命令的字都是保留字)重复。而且,变量是区分大小写的,例如,variable&和Variable&是两个不同的变量。不仅如此,大部分命令和"对象"(请参阅"对象化编程"章)都是区分大小写的。
提示给变量命名,最好避免用单个字母"a""b""c"等,而改用能清楚表达该变量在程序中的作用的词语。这样,不仅别人能更容易的了解你的程序,而且你在以后要修改程序的时候,也很快会记得该变量的作用。变量名一般用小写,如果是由多个单词组成的,那么第一个单词用小写,其他单词的第一个字母用大写。例如:myVariable&和&myAnotherVariable。这样做仅仅是为了美观和易读,因为&JavaScript&一些命令(以后将用更具体的方法阐述"命令"一词)都是用这种方法命名的:indexOf;charAt&等等。
变量的赋值一个变量声明后,可以在任何时候对其赋值。赋值的语法是:
&变量& = &表达式&;
其中"="叫"赋值符",它的作用是把右边的值赋给左边的变量。下一节将讨论到表达式。
JavaScript常数有下列几个:
null&一个特殊的空值。当变量未定义,或者定义之后没有对其进行任何赋值操作,它的值就是"null"。企图返回一个不存在的对象时也会出现null值。NaN&"Not a Number"。出现这个数值比较少见,以至于我们可以不理它。当运算无法返回正确的数值时,就会返回"NaN"值。NaN&值非常特殊,因为它"不是数字",所以任何数跟它都不相等,甚至&NaN&本身也不等于&NaN&。true&布尔值"真"。用通俗的说法,"对"。false&布尔值"假"。用通俗的说法,"错"。
6.3.1&注释
JavaScript&注释有两种:单行注释和多行注释。单行注释用双反斜杠"//"表示。当一行代码有"//",那么,"//"后面的部分将被忽略。而多行注释是用"/*"和"*/"括起来的一行到多行文字。程序执行到"/*"处,将忽略以后的所有文字,直到出现"*/"为止
6.3.2 if&语句
if ( &条件& ) &语句1& [ else &语句2& ];本语句有点象条件表达式"?:":当&条件&为真时执行&语句1&,否则,如果&else&部分存在的话,就执行&语句2&。与"?:"不同的是,if&只是一条语句,不会返回数值。&条件&是布尔值,必须用小括号括起来;&语句1&和&语句2&都只能是一个语句,欲使用多条语句,请用语句块。
if (a == 1)& if (b == 0) alert(a+b);else& alert(a-b);
if (a == 1)
{& if (b == 0) alert(a+b);} else {& alert(a-b);}
示例风格不良的对齐&&&&&&&&&&&&&&&&&&&&&&示例风格良好的对齐
6.3.3&循环体
for (&变量&=&初始值&; &循环条件&; &变量累加方法&)&语句&;
提示适当的使用&for&循环,能使&HTML&文档中大量的有规律重复的部分简化,也就是用&for&循环重复写一些&HTML&代码,达到提高网页下载速度的目的。不过请在&Netscape&中重复进行严格测试,保证通过了才好把网页传上去。作者曾试过多次因为用&for&循环向文档重复写&HTML&代码而导致&Netscape"猝死"。IE&中绝对没有这种事情发生,如果你的网也是只给&IE&看的,用多多的&for&也没问题。
6.3.4 switch&语句
如果要把某些数据分类,例如,要把学生的成绩按优、良、中、差分类。我们可能会用&if&语句,但使用太多的&if&语句的话,程序看起来有点乱。switch&语句就是解决这种问题的最好方法。
switch (e)
&{& case r1:&(注意:冒号)& & ...& & []& case r2:& & ...& & []& ...& [default:& & ...]}&
ADO.NET命名规范
数据类型简写
标准命名举例
Connection&
conNorthwind&
cmdReturnProducts&
Parameter&
parmProductID&
DataAdapter&
dadProducts&
DataReader&
dtrProducts&
dstNorthWind
DataTable&
dtblProduct&
drowRow98&
DataColumn&
dcolProductID&
DataRelation&
drelMasterDetail&
dvwFilteredProducts&
WinForm Control 命名规范
数据类型简写
标准命名举例
lblMessage&
LinkLabel&
llblToday&
RadioButton&
rbtnSelected&
PictureBox&
lstProducts&
CheckedListBox&
clstChecked
lvwBrowser&
TabControl&
tctlSelected&
DateTimePicker&
dtpStartDate&
HscrollBar&
VscrollBar&
ImageList&
ilstImage&
tlbManage&
stbFootPrint&
OpenFileDialog&
SaveFileDialog&
FoldBrowserDialog&
fgdlgBrowser&
FontDialog&
ColorDialog&
cdlgColor&
PrintDialog&
pdlgPrint&
WebControl 命名规范
数据类型简写
标准命名举例
AdRotator&
btnSubmit&
calMettingDates&
CheckBoxList&
chklFavColors&
CompareValidator&
valcValidAge&
CustomValidator&
valxDBCheck&
dgrdTitles&
dlstTitles&
DropDownList&
dropCountries&
HyperLink&
lnkDetails&
imgAuntBetty&
ImageButton&
ibtnSubmit&
lblResults&
LinkButton&
lbtnSubmit&
lstCountries&
PlaceHolder&
plhFormContents&
RadioButton&
RadioButtonList&
radlGender&
RangeValidator&
RegularExpression&
valeEmail_Validator&
rptQueryResults&
RequiredFieldValidator&
valr&& &&&&&&&&
valrFirstName&
tbl&&&&&&&&&
tblCountryCodes&
TableCell&&&&&
tblcGermany
TableRow&&&&
tblrCountry&
TextBox&&&&
txtFirstName&
ValidationSummary&&
valsFormErrors&
xmlc&&&&&&
xmlcTransformResults&
变量变量的作用域及前缀
ststrName&
模块或者窗体的局部变量
AintCount[]
变量数据类型的前缀
C#数据类型
类库数据类型
标准命名举例
System.sbyte&
System.Int16&
System.Int32&
System.Int64&
System.Byte&
System.Uint16&
System.Uint32&
System.Uint64&
System.Single&
System.Double&
System.Decimal&
System.Boolean&
System.Char&
System.Object&
System.String&
System.DateTime&
System.Intpre&
常量定义常量=作用域+ c+数据类型+变量名
类对象定义&类实例=作用域+cls+变量名&类对象=C+名称
结构对象定义&结构对象实例=作用域+struc+变量名&结构对象=S+名称
命名空间定义&以层为前缀进行命名
接口定义&以大写I为前缀
窗体的命名规则&窗体名=frm+窗体名(名词+动词)注意:保存的文件明和窗体名相同。
枚举定义规则&以Enum为前缀
事件命名规则&事件控制器要带有EventHandler后缀&使用sender和e命名两个参数&事件参数类要带有EventArgs后缀&考虑使用动词命名事件&对于有"之前"或"之后"概念的事件,要使用现在时或过去时命名
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
Asp.Net教程最近更新

我要回帖

更多关于 ionic row col换行 的文章

 

随机推荐