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 这样的集合会存在拆箱和装箱问题,占用程序很大的性能,如果数量过多会严重影响性能。