开发过程的一些性能总结

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(inti=0;i<50;i++)
{
SPListItem listItem = list.Items[i];
}

这样每次都会请求SPListItemCollection集合的新的对象,而使item集合对象没有被缓存。因此不断的从数据库请求所有的数据项,对性能上造成很大的影响。

建议的方法是:

SPListItemCollection item = SPContext.Current.List.Items;
For(inti=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(intitemIndex=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. 如果遇到字符串拼接,我们通常使用StringBuilder,而不是直接使用字符串直接的链接

字符串直接的链接需要的内存量很大,效率很低。建议方法如下:

StringBuilder msgString =newStringBuidler();
xmlString.Append(“message1”);
xmlString.Append(“message1”);
string message = msgString.ToString();

不建议使用的方法是:

String message = “message1”+”message2”;

特别是在消息字符串很长的情况下。程序运行的效率相当的低。

7. SharePoint中有一些对象是非托管的对象,所以需要我们手动进行释放,防止内存泄漏。

例如:SPSite,SPWeb等等其他一些对象。但是需要注意的是我们如果使用全局的SPWeb,就不应该进行释放,例如:SPContext.Current.Web就是一个全局的Web对象,当我们使用这个对象的时候,我们不应该把这个对象进行Dispose。

一般的释放非托管对象的方法有两种:

(1) try ---catch---finally

SPSite site = null;
Try
{
Site =newSPSite(“http://server:80”);
}
Catch(Exception er)
{
//TODO:
}
Finally
{
If(site !=null)
{
Site.Dispose();
}
}

(2) using

using(SPSite site =newSPSite(“http://server:80”))
{
//TODO
}

8. 字符串的比较操作

在比较的时候我们应该注意是否忽略大小写,这个地方是很容易出现问题的地方。

String name1 = “A”;
String name2 = “a”;
Bool flag = name1.Equals(name2);// flag 是false
Bool flag = name1.Equals(name2, StringComparison.OrdinalIgnoreCase);//flag 是true

9. 在SharePoint中我们要设置folder的权限,首先我们要打破原有的继承的权限,但是这里有一个问题需要注意一下:

如果使用folder.Item.BreakRoleInheritance(false)的时候会抛出一个异常,原因是SharePoint API中原有这个问题。我们解决这个问题通常使用folder. Item.BreakRoleInheritance(true);然后我们在删除掉他原有的权限。这样操作之后再给这个folder赋予新的权限即可。

10. 保持程度的可读性

(1) 在程序中最好不要多次使用return , 尽量在程序结束或是我们的逻辑完成的时候进行return例如:

?
1
2
3
4
5
6
7
8
9
10
If(testValue == 1)
{
Return 1;
}
Else if(testValue == 2)
{
Return 2;
}
…….

建议使用如下方法:

?
1
2
3
4
5
6
7
8
9
10
11
Int returnValue =0;
If(testValue ==1)
{
returnValue = 1;
}
Elseif(testValue ==2)
{
returnValue = 2;
}
……
Return returnValue;

(2) 在程序中尽量不要使用GoTo语句,使用GoTO语句使程序非常的不可读,可能之后编写程序的人才懂程序的意思,其他人根本看不懂程序是完成什么功能的,还有可能时间长了,编写程序的人自己也不懂具体是什么意思了,这样会非常糟糕,不利于以后的扩展和维护。

11. 判断字符串是否为空串,应该尽量使用下面方法:

String message = “123”;

Bool flag = string.IsNullOrEmpty(message);

我们在初始化一个空字符串的时候,应该尽量使用如下方法:

String str1 = string.Empty;

尽量不要使用 string str2 = “”;

因为这两种内存分配的方式,是不同的,C#内部处理的机制也是不相同的。

12. 注意C#中的拆箱和装箱问题

在编程实践中我们如果使用List<T> lists = new List<T>();,能够解决的问题,最好不要使用ArrayList和Hashtable等集合,因为ArrayList、Hashtable这样的集合会存在拆箱和装箱问题,占用程序很大的性能,如果数量过多会严重影响性能。

13. SharePoint中的非托管对象需要我们手动释放资源
SPGlobalAdmin、SPSite、SPWeb、SPFileStream等等一些对象需要进行手动释放资源。由于SharePoint中有这些非托管对象,所以我们编程的时候应该特别注意,如果有些资源没有释放,会造成内存溢出。并且很多时候我们自定义的程序是由IIS调用的,如果没有释放资源,可能会是IIS 崩溃,造成不必要的麻烦。

14. SharePoint中不能上传大小为0 KB的文件,由于SharePoint上传文档的时候会将这个文件的内容一并写进数据库的Content字段,如果文件的大小是0,则这个byte [] 将没有内容,所以不会成功。如果我们要对0KB的文件进行上传的话,我们需要使用程序进行特殊处理:
一是可以在这个文件中添加我们的标识信息,当取得其中的内容的时候我们也可以将标识信息去掉,然后就是内容信息。或者使用API也是可以处理添加0 KB 文件的。或者使用Explorer View进行上传也可以上传大小为0 KB的文件。

15. 当SharePoint中list打开Version开关的时候,我们可以对文档的操作进行使用版本控制,并且可以根据不同时间的修改产生的不同的version来取得不同version的文档。在这里下载不同的version的文档有不同的地址,我们可以根据version来计算这个文档的地址。如果打开Major Version的时候version会按照1.0、2.0、、、递增,如果是打开Major和Minor Version的时候version会按照0.1、0.2、、、递增,当前的也就是version最大的文档的地址是正常的,历史的version的文档的地址是不同的,在站点url后面加上_vti_history/version的个位*512 + 小数点后的数字/文档url。

16. SharePoint中的内存泄漏问题
(1) 当使用 list.ParentWeb,或folder.ParentWeb 等等只要使用这个ParentWeb属性,那么这个ParentWeb是需要释放的。
(2) 同样道理,我们只要使用了web.Site属性,那么这个Site对象是需要释放的。
(3) 我们一般对这两个对象进行释放的时候,都是使用Dispose()方法,其实Dispose()方法内部也只是简单的调用了Close()方法,但是我们还是建议使用Dispose()方法进行释放。这样不会造成一些SharePoint API自身产生的一些错误。

(4) 使用OpenWeb()方法和SelfServiceCreateSite()方法时都会返回一个SPWeb对象,这些对象都需要进行手动释放。
(5) 我们使用索引器取得Site或是Web的时候,都需要进行手动释放,因为我们去的了SPWeb和SPSite都会在内存中申请相应的空间,但是由于是非托管的对象所以我们还是以需要进行手动释放的。
(6) 当我们使用SPSite的LockIssue、Owner、SecondaryContact属性的时候,会隐式的调用RootWeb属性,所以我们需要对这个RootWeb对象进行释放。

MOSS--SharePoint 开发学习一些总结相关推荐

  1. 步步为营 SharePoint 开发学习笔记系列 七、SharePoint Timer Job 开发

    概要 项目需求要求我们每天晚上同步员工的一些信息到sharepoint 的user List ,我们决定定制开发sharepoint timer Job,Sharepoint timer Job是sh ...

  2. sharepoint 2010 moss 培训教程 sharepoint开发经常需要用到的一些基本知识点

    列一下之前做的一些关于moss,sharepoint 2010的培训课程,主要是sharepoint开发经常需要用到的一些基本知识点. sharepoint应用篇 1.sharepoint 安装与部署 ...

  3. Moss/Sharepoint:自定义 Oracle Membership

    本文记录编写一个简单的基于oracle的membership for sharepoint示例.当项目客户的员工信息在其他的数据库,或者有员工信息遗留表的情况下可以考虑用自定义membership的方 ...

  4. 体感开发学习总结 - 二

    Kinect开发学习笔记之(一)Kinect介绍和应用 http://blog.csdn.net/zouxy09/article/details/8145592 一.Kinect简介       Ki ...

  5. 【转】SharePoint开发中可能用到的各种Context(上下文)

    第一部分 服务器端上下文 一.HttpContext 这个--我想就不用再介绍了,SharePoint运行在标准的ASP.NET框架下(2003用的不是标准的ASP.NET 1.1,不过这年头还有人用 ...

  6. Moss/Sharepoint 为特定用户组设置特定视图以及可见视图,自定义列表新建页,修改页和显示页(无代码法)...

    首先介绍一个简单的方法: SharePoint不提供视图权限的直接控制方法. 不过可以采用另一种方式实现: 这里先假设有两种权限的用户组: 首先,在你希望设置权限的Custom List 或 Docu ...

  7. sharepoint 2016 学习系列篇(1)-关于sharepoint

    最近微软已经推出了sharepoint server 2016,时间过得好快,不知不觉,从2008年开始,做sharepoint开发,到现在,也有8年左右的时间了,经过了sharepoint serv ...

  8. sharepoint 2016 学习系列篇(23)-文档库应用篇-(5)文档权限配置

    学习了关于文档的上传,下载,以及属性标签的应用,朋友们估计也会想到,前面学习到了关于列表的数据权限配置, sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置 那么 ...

  9. sharepoint 2016 学习系列篇(24)-文档库应用篇-(6)文档版本控制

    学习到这里,相信朋友们,应该是对文档库有了大概的认识.回顾一下,前面学习了一个 sharepoint 2016 学习系列篇(17)-自定义列表应用篇-(6)开启列表数据版本控制 那么对于文档来说,文档 ...

  10. sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置

    当数据已经录入到列表中之后,接下来,朋友们可能会想知道,有些数据,只想给某些用户看到,或者编辑,列表是否支持这样的操作. 大微软的sharepoint平台,对于用户的需求,可以说是考虑得很周全的,权限 ...

最新文章

  1. 约翰霍普金斯大学Alan Yuille教授招收计算机视觉暑期科研实习生
  2. Scala模式匹配:for循环表达式中的模式匹配
  3. 函数式编程filter函数,list()表示列表显示值
  4. 个人Typech情侣主题Cupid模板
  5. JVM整体架构与调优参数说明
  6. 熊猫烧香病毒源码及分析
  7. Matlab计算机视觉/图像处理工具箱推荐
  8. ccboot最新服务器配置,使用CCBoot如何优化服务器和客户端网卡
  9. Android数据持久化存储(一)
  10. [VOT14](2022CVPR)CSWinTT: Transformer Tracking with Cyclic Shifting Window Attention
  11. SAP SM04踢人操作(摘录)
  12. QT5.7操作word
  13. react-hooks+Ant Design Mobile中的自定义表单验证
  14. 再见,我亲手创办的公司
  15. 硬货-如何用风控拯救下架的小红书
  16. 李梦娇口诀88条(视频+讲义)
  17. 一文读懂元宇宙--元宇宙技术及技术瓶颈
  18. arcgis地图怎么标注当前位置
  19. Codeforces Round #703 (Div. 2) A-E 题解
  20. 橱柜选购要简约实用 合理配置能够节省成本

热门文章

  1. KT1025A蓝牙芯片模块关于录音功能的一些常见问题_以及解答
  2. 中小企业上马ERP要谨慎
  3. 大白话说期权——除了买涨买跌,我们还能怎么交易?二元期权又是什么鬼?
  4. 小旋风asp服务器安装了还是打不开asp文件,小旋风AspWebServer - 本地架设ASP网站
  5. 58 同城移动端 Passport SDK 的设计与技术细节
  6. macOS 使用 X11 运行远端 linux 中的 x11 client 图形程序
  7. c语言短信猫开发代码
  8. 虚拟化中的链接克隆技术
  9. 弘辽科技:淘宝商品降权的影响是什么?为什么被降权?
  10. Win10早期版本下月终止服务、百万医疗设备存在漏洞风险|11月10日全球网络安全热点