1. 取得列表中的Item的数量:
Int count = SPContext.Current.List.Items.Count;
这句是取得Item的数目,不得不取得列表中的所有的Item的metadata,这样我们程序运行的速度就会相对慢一些,如果列表中的数据量不大,那不会有明显的影响,如果列表中的数据量很大,那在效率上会有很大的影响。
Int count = SPContext.Current.List.ItemCount;//建议使用这个来取得列表中的item数量。
2. 显示列表中的item
SPList list = SPContext.Current.List;
For(int i=0;i<50;i++)
{
SPListItem listItem = list.Items[i];
}
这样每次都会请求SPListItemCollection集合的新的对象,而使item集合对象没有被缓存。因此不断的从数据库请求所有的数据项,对性能上造成很大的影响。
建议的方法是:
SPListItemCollection item = SPContext.Current.List.Items;
For(int i=0;i<50;i++)
{
SPListItem item = items[i];
}
3. 取得item对象
SPListItem item = SPContext.Current.List.Items[0];
这句主要是从list中先取得对象的所有的Item的Metadata,然后再从这些Item的集合中取得到index是0的Item
建议使用下面语句进行取得Item对象:
SPListItem item = SPContext.Current.List.GetItemById(0);
两句SDK执行的区别就是我们使用SQL语句进行查询的时候,第一没有设置where子句的条件,而第二句则是设置了where子句的条件,在数据量很大的情况下,这样第二句执行的速度会远远大于第一句执行的速度。
4. 更新大量的SharePoint 列表数据项
For(int itemIndex=0;itemIndex<100;itemIndex++)
{
SPListItem newItem = items.Add();
newItem.Update();
}
实际上item的Add 或是Update方法是调用了一个存储过程,来完成这个操作的。
如果需要大量的数据更行的使用建议使用SPWeb的ProcessBatchData方法进行更新。具体实例如下:
SPContext.Current.Web.ProcessBatchData(queryString);
5. 取得SharePoint的列表对象
SPList list = SPContext.Current.Web.Lists[title];
这句取得列表对象先从站点中取得所有的List的Metadata和title进行比较,找到符合条件的list之后返回。
建议使用下面的方法取得列表对象:
SPList list = SPContext.Current.Web.GetList(listUrl);或
SPList list = SPContext.Current.Web.GetListByUrl(listUrl);
6. SharePoint中常用的自定义Feature的Location和GroupId
位置 | 自定义操作组 ID | 组说明 | 默认自定义操作 ID |
DisplayFormToolbar | N/A | Location对应于列表的显示表单工具栏。 | ExportEventToolbarButton(日历) ExportContactToolbarButton(联系人) |
EditControlBlock | N/A | 对应于每项编辑控件块 (ECB) 菜单。 |
|
EditFormToolbar | N/A | Location对应于列表的编辑表单工具栏。 |
|
Microsoft.SharePoint.Administration.ApplicationCreated | 链接 | “已创建应用程序”页。 | CreateSite HomePage |
Microsoft.SharePoint.Administration.ApplicationManagement | ApplicationSecurity | 管理中心的“应用程序管理”页面上的“应用程序安全性”部分。 | · WebPartSecurity · SelfService · WebApplicationSecurity · ManagePolicy ManageAuthenticationProviders |
Microsoft.SharePoint.Administration.ApplicationManagement | ExternalService | · 管理中心的“应用程序管理”页面上的“外部服务连接”部分。 | · OfficialFile · HtmlViewer DocConversion |
Microsoft.SharePoint.Administration.ApplicationManagement | SiteManagement | · 管理中心的“应用程序管理”页面上的“SharePoint 网站管理”部分。 | · CreateSite · DeleteSite · SiteUse · QuotaDefinition · SiteQuota · SiteOwners ListSiteCollections |
Microsoft.SharePoint.Administration.ApplicationManagement | WebApplicationConfiguration | · 管理中心的“应用程序管理”页面上的“SharePoint Web 应用程序管理”部分。 | · Extend · Unextend · Delete · ManagedPaths · EmailSettings · GeneralSettings · ManageContentDatabases · ManageWebAppFeatures ListWebApplications |
Microsoft.SharePoint.Administration.ApplicationManagement | WorkflowManagement | 管理中心的“应用程序管理”页面上的“工作流管理”部分。 | WorkflowManagement |
Microsoft.SharePoint.Administration.Operations | BackupRestore | 管理中心的“操作”页面上的“备份和还原”部分。 | · Backup · BackupHistory · Restore BackupStatus |
Microsoft.SharePoint.Administration.Operations | DataConfiguration | 管理中心的“操作”页面上的“数据配置”部分。 | · DefaultDatabase DataRetrieval |
Microsoft.SharePoint.Administration.Operations | GlobalConfiguration | · 管理中心的“操作”页面上的“全局配置”部分。 | · RunningJobs · JobDefinitions · AlternateAccessMappings · ManageFarmFeatures Solutions |
Microsoft.SharePoint.Administration.Operations | LoggingAndReporting | 管理中心的“操作”页面上的“日志记录和报告”部分。 | · DiagnosticLogging UsageAnalysis |
Microsoft.SharePoint.Administration.Operations | Security | 管理中心的“操作”页面上的“安全性配置”部分。 | · ServiceAccount · Irm · Antivirus · BlockedFileTypes AdministrationRoles |
Microsoft.SharePoint.Administration.Operations | Topology | 管理中心的“操作”页面上的“拓扑结构和服务”部分。 | · FarmServers · TopologyServices · IncomingEmailServer · ApproveDGs EmailConfiguration |
Microsoft.SharePoint.Administration.Operations | Upgrade | 管理中心的“操作”页面。 | · SiteUpgradeStatus FinalizeUpgrade |
Microsoft.SharePoint.ContentTypeSettings | Fields | · 网站集的“内容类型”页面上的“列”部分。 | · AddField · ReorderFields |
Microsoft.SharePoint.ContentTypeSettings | General | · 网站集的“内容类型”页面上的“设置”部分。 | · ChangeNameDescription · ChangeOptionalSettings · ChangeWorkflowSettings · RemoveContentType |
Microsoft.SharePoint.ContentTypeTemplateSettings | Fields | · 列表的“内容类型”页面上的“列”部分。 | · AddField · ReorderFields |
Microsoft.SharePoint.ContentTypeTemplateSettings | General | 列表的“内容类型”页面上的“设置”部分。 | · ChangeNameDescriptionGroup · ChangeOptionalSettings · ChangeWorkflowSettings RemoveContentType |
Microsoft.SharePoint.Create | WebPages | “创建”页面上的“网页”部分。 |
|
Microsoft.SharePoint.GroupsPage | NewMenu | 网站集的“人员和组”页面上的“新建”菜单。 |
|
Microsoft.SharePoint.GroupsPage | SettingsMenu | 网站集的“人员和组”页面上的“设置”菜单。 |
|
Microsoft.SharePoint.ListEdit | Communications | 列表或文档库的“自定义”页面上的“通信”部分。 |
|
Microsoft.SharePoint.ListEdit | GeneralSettings | 列表的“自定义”页面上的“常规设置”部分。 |
|
Microsoft.SharePoint.ListEdit | Permissions | 列表或文档库的“自定义”页面上的“权限和管理”部分。 |
|
Microsoft.SharePoint.ListEdit.DocumentLibrary | GeneralSettings | 文档库的“自定义”页面上的“常规设置”部分。 |
|
Microsoft.SharePoint.PeoplePage | ActionsMenu | 网站集的“人员和组”页面上的“操作”菜单。 |
|
Microsoft.SharePoint.PeoplePage | NewMenu | 网站集的“人员和组”页面上的“新建”菜单。 |
|
Microsoft.SharePoint.PeoplePage | SettingsMenu | 网站集的“人员和组”页面上的“设置”菜单。 |
|
Microsoft.SharePoint.SiteSettings | Customization | · “网站设置”页面上的“外观”部分。 | · ProjectSettings · NavOptions · Theme · TopNav · QuickLaunch · SaveAsTemplate · ReGhost |
Microsoft.SharePoint.SiteSettings | Galleries | · “网站设置”页面上的“库”部分。 | · MasterPageCatalog · ManageCType · ManageField · SiteTemplates · ListTemplates · WebParts · Workflows |
Microsoft.SharePoint.SiteSettings | SiteAdministration | · “网站设置”页面上的“网站管理”部分。 | · RegionalSettings · LibrariesAndLists · WebUsage · UserAlerts · RSS · SrchVis · ManageSubWebs · ManageSiteFeatures · DeleteWeb |
Microsoft.SharePoint.SiteSettings | SiteCollectionAdmin | · “网站设置”页面上的“网站集管理”部分。 | · DeletedItems · SiteCollectionUsage · Storage · ManageSiteCollectionFeatures · Hierarchy · Portal |
Microsoft.SharePoint.SiteSettings | UsersAndPermissions | · “网站设置”页面上的“用户和权限”部分。 | · PeopleAndGroups · SiteCollectionAdministrators · User |
Microsoft.SharePoint.StandardMenu | ActionsMenu | 列表和文档库视图中的“操作”菜单。 |
|
Microsoft.SharePoint.StandardMenu | ActionsMenuForSurvey | 用于调查的“网站操作”菜单。 |
|
Microsoft.SharePoint.StandardMenu | NewMenu | 列表和文档库视图中的“新建”菜单。 |
|
Microsoft.SharePoint.StandardMenu | SettingsMenu | 列表和文档库视图中的“设置”菜单。 |
|
Microsoft.SharePoint.StandardMenu | SettingsMenuForSurvey | 用于调查的“网站设置”链接。 |
|
Microsoft.SharePoint.StandardMenu | SiteActions | “网站操作”菜单。 |
|
Microsoft.SharePoint.StandardMenu | UploadMenu | 文档库视图中的“上载”菜单。 |
|
Microsoft.SharePoint.User | ActionsMenu | 网站的“权限”页面上的“操作”菜单。 |
|
Microsoft.SharePoint.User | NewMenu | 网站的“权限”页面上的“新建”菜单。 |
|
Microsoft.SharePoint.User | SettingsMenu | 网站的“权限”页面上的“设置”菜单。 |
|
Microsoft.SharePoint.Workflows | LeftNavBarLinks | 用于管理工作流的页面上的左侧导航区域。 |
|
NewFormToolbar | N/A | Location对应于列表的新建表单工具栏。 |
|
ViewToolbar | N/A | Location对应于列表视图中的工具栏。 |
|
7. 如果遇到字符串拼接,我们通常使用StringBuilder,而不是直接使用字符串直接的链接
字符串直接的链接需要的内存量很大,效率很低。建议方法如下:
StringBuilder msgString = new StringBuidler();
xmlString.Append(“message1”);
xmlString.Append(“message1”);
string message = msgString.ToString();
不建议使用的方法是:
String message = “message1”+”message2”;
特别是在消息字符串很长的情况下。程序运行的效率相当的低。
8. SharePoint中有一些对象是非托管的对象,所以需要我们手动进行释放,防止内存泄漏。
例如:SPSite,SPWeb等等其他一些对象。但是需要注意的是我们如果使用全局的SPWeb,就不应该进行释放,例如:SPContext.Current.Web就是一个全局的Web对象,当我们使用这个对象的时候,我们不应该把这个对象进行Dispose。
一般的释放非托管对象的方法有两种:
(1) try ---catch---finally
SPSite site = null;
Try
{
Site = new SPSite(“http://server:80”);
}
Catch(Exception er)
{
//TODO:
}
Finally
{
If(site != null)
{
Site.Dispose();
}
}
(2) using
using(SPSite site = new SPSite(“http://server:80”))
{
//TODO
}
9. 字符串的比较操作
在比较的时候我们应该注意是否忽略大小写,这个地方是很容易出现问题的地方。
String name1 = “A”;
String name2 = “a”;
Bool flag = name1.Equals(name2);// flag 是false
Bool flag = name1.Equals(name2,StringComparison.OrdinalIgnoreCase);//flag 是true
10. 在SharePoint中我们要设置folder的权限,首先我们要打破原有的继承的权限,但是这里有一个问题需要注意一下:
如果使用folder.Item.BreakRoleInheritance(false)的时候会抛出一个异常,原因是SharePoint API中原有这个问题。我们解决这个问题通常使用folder. Item.BreakRoleInheritance(true);然后我们在删除掉他原有的权限。这样操作之后再给这个folder赋予新的权限即可。
11. 保持程度的可读性
(1) 在程序中最好不要多次使用return , 尽量在程序结束或是我们的逻辑完成的时候进行return例如:
If(testValue == 1)
{
Return 1;
}
Else if(testValue == 2)
{
Return 2;
}
…….
建议使用如下方法:
Int returnValue =0;
If(testValue ==1)
{
returnValue = 1;
}
Elseif(testValue ==2)
{
returnValue = 2;
}
……
Return returnValue;
(2) 在程序中尽量不要使用GoTo语句,使用GoTO语句使程序非常的不可读,可能之后编写程序的人才懂程序的意思,其他人根本看不懂程序是完成什么功能的,还有可能时间长了,编写程序的人自己也不懂具体是什么意思了,这样会非常糟糕,不利于以后的扩展和维护。
12. 判断字符串是否为空串,应该尽量使用下面方法:
String message = “123”;
Bool flag = string.IsNullOrEmpty(message);
我们在初始化一个空字符串的时候,应该尽量使用如下方法:
String str1 = string.Empty;
尽量不要使用 string str2 = “”;
因为这两种内存分配的方式,是不同的,C#内部处理的机制也是不相同的。
13. 注意C#中的拆箱和装箱问题
在编程实践中我们如果使用List<T> lists = new List<T>();,能够解决的问题,最好不要使用ArrayList和Hashtable等集合,因为ArrayList、Hashtable这样的集合会存在拆箱和装箱问题,占用程序很大的性能,如果数量过多会严重影响性能。