<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DotNet3.0 on 冯威的博客</title><link>https://fwhyy.com/tags/dotnet3.0/</link><description>Recent content in DotNet3.0 on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 02 Sep 2012 00:00:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/dotnet3.0/atom.xml" rel="self" type="application/rss+xml"/><item><title>C# &amp; .NET 1.0-4.0</title><link>https://fwhyy.com/2012/09/c-net-1-0-4-0/</link><pubDate>Sun, 02 Sep 2012 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2012/09/c-net-1-0-4-0/</guid><description>&lt;p&gt;学习和使用.NET平台已有六七个年头了，05年开始学习.NET的时候，当时网上的资源不像现在这样丰富，所以去电脑城买了张盗版的VS2005的光盘，安装时才发现是VS2003，当时有一种被坑的感觉，但也正是如此，让我有了一个完整的.NET的学习生涯。&lt;/p&gt;
&lt;p&gt;从我从业的经历来看VS2003和VS2008是使用的比较多的，一些历史遗留的老项目由种种原因没有升级，依然在使用VS2003。我现在所在的公司也只使用VS2003和VS2008这两种开发工具，尽管TFS已经是2010了。很多时候公司觉得够用也就不去升级开发工具了。从1.0到4.0的变化主要体现在DotNet平台、语言和开发工具这三个方面。本文只是概括性的讲述在每个版本里都有些什么新的特性。先看下面的一张表格，描述的不同版本的出生年份、对应的VS版本和CLR的版本。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290756052.webp" alt="2012-07-04_230408" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;上图中需要注意的一点是：2.0 3.0 3.5的CLR版本都是2.0。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;在1.1版本中，从语言的角度就是基本的面向对象的语法，可以说任何一般C#语言的书籍都包含了C#1的所有内容。工具方面VS2003已经很强大了，即便是到了现在的VS2012，我们80%时候用到的也只不过是20%的功能。&lt;/p&gt;
&lt;p&gt;在VS2003中创建ASP.NET项目默认是跟IIS相关联的，从VSS中拉VS2003的代码时需要先在IIS中创建好站点，端口要和VSS中代码的相对应，但有时会出现很多问题。我一般的做法是将代码拉到本地后，修改解决方案文件中的路径为本地路径，然后修改项目文件中的ProjectType为Local，默认是Web，就可以很顺利打开项目了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2.0中对应VS2005我用的也不多，因为很快就被VS2008替代了，不过在语言方面却带来了很多新的东西。&lt;/p&gt;
&lt;p&gt;★C#2中最重要的一个特性应该就是泛型。泛型的用处就是在一些场景下可以减少强制转换来提高性能。在C#1中就有很多的强制转换，特别是对一些集合进行遍历时，如ArrayList、HashTable，因为他们是为不同数据类型设计的集合，所以他们中键和值的类型都是object，这就意味着会平凡发生装箱拆箱的才做。C#2中有了泛型，所以我们可以使用List&lt;T&gt;、Dictionary&amp;lt;Tkey,TValue&amp;gt; 。泛型能够带来很好的编译时类型检查，也不会有装箱拆箱的才做，因为类型是在使用泛型的时候就已经指定了。&lt;/p&gt;
&lt;p&gt;DotNet已经通过了很多的泛型类型供我们使用，如上面提到的List&lt;T&gt;,Dictionary&amp;lt;Tkey,TValue&amp;gt;,我们也可以自己来创建泛型类型(类、接口、委托、结构)或是方法。在定义泛型类型或时可以通过定义泛型约束来对泛型参数进行限制，更好的使用编译时检查。泛型约束是通过关键字where来实现的，C#2中的泛型约束有4种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引用类型约束：确保类型实参是引用类型，使用where T:class来表示；&lt;/li&gt;
&lt;li&gt;值类型约束：确保类型实参是值类型，使用where T:truct来表示；&lt;/li&gt;
&lt;li&gt;构造函数类型约束，使用where T:new()来表示；&lt;/li&gt;
&lt;li&gt;转换类型约束：约束类型实参是另外的一种类型，例如：where T:IDisposable 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;★C#2提供了分部类（Partil）。分部类可以允许我们在多个文件中为一个类型编写代码，在Asp.Net2.0中用的极为广泛。新建一个Aspx页面，页面的CodeBehind和页面中的控件的定义就是通过分部类来实现的。如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public partial class _Default : System.Web.UI.Page 
public partial class _Default 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分布类使用关键字partial来定义，当一个类中的代码非常多时，可以使用分部类来进行拆分，这对代码的阅读很有好处，而且不会影响调用。&lt;/p&gt;
&lt;p&gt;★C#2中增加了静态类，静态类中的公用方法必须也是静态的，可以由类名直接调用，不需要实例化，比较适用于编写一些工具类。如System.Math类就是静态类。工具类有一些特点，如：所有成员都是静态的、不需要被继承、不需要进行实例化。在C#1中我们可以通过如下代码来实现：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;//声明为密封类防止被继承 
public sealed class StringHelper
{
 //添加私有无参构造函ˉ数防止被实例化，如果不添加私有构造函数 //会自动生成共有无参构造函数 
 private StringHelper(){};
 public static int StringToInt32(string input)
 {
 int result=0;
 Int32.TryParse(input, out result);
 return result;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;C#2中可以使用静态类来实现：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public static class StringHelper
{
 public static int StringToInt32(string input)
 {
 int result=0;
 Int32.TryParse(input, out result);
 return result;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;★在C#1中声明属性，属性中的get和set的访问级别是和属性一致，要么都是public要么都是private，如果要实现get和set有不同的访问级别，则需要用一种变通的方式，自己写GetXXX和SetXXX方法。在C#2中可以单独设置get和set的访问级别，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;private string name;
public string Name
{
 get { return name; }
 private set { name = value; }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;需要注意的是，不能讲属性设置为私有的，而将其中的get或是set设置成公有的，也不能给set和get设置相同的访问级别，当set和get的访问级别相同时，我们可以直接设置在属性上。&lt;/p&gt;
&lt;p&gt;★命名空间可以用来组织类，当不同的命名空间中有相同的类时，可以使用完全限定名来防止类名的冲突，C#1中可以使用空间别名来简化书写，空间别名用using关键字实现，看下面一个例子:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;namespace NameSpaceDemo1
{
 public class ClassDemo{}
}
namespace NameSpaceDemo2
{
 public class ClassDemo{}
}
using Demo1 = NameSpaceDemo1;
using Demo2 = NameSpaceDemo2;
namespace WebApplication2
{
 public partial class _Default : System.Web.UI.Page 
 {
 protected void Page_Load(object sender, EventArgs e)
 {
 Demo1.ClassDemo c1 = new Demo1.ClassDemo();
 Demo2.ClassDemo c2 = new Demo2.ClassDemo();
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果我们在使用中添加了名为Demo1或是Demo2的类，那么空间别名的使用就会受到影响，在C#1中就得使用完全限定名了。在C#2中可以用“::”符号来解决，如下面代码：&lt;/p&gt;</description></item><item><title>SharePoint2007安装图文详解四：安装.NET Framework 3.0和SharePoint 2007</title><link>https://fwhyy.com/2011/01/installation-of-the-net-framework-3-0-and-sharepoint-2007/</link><pubDate>Tue, 11 Jan 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/01/installation-of-the-net-framework-3-0-and-sharepoint-2007/</guid><description>&lt;p&gt;终于到了SharePoint2007安装的最后一步了，.NET Framework 3.0在官网可以下载，不过需要连接到网络才可以安装，SharePoint2007我下载的是官网的半年试用版，但安装的时候居然要求输入序列号，随便搜了一个顺利通过，嘿嘿！下面是下载链接地址和序列号&lt;/p&gt;
&lt;p&gt;.NETFramework3.0：&lt;a href="http://www.microsoft.com/downloads/zh-cn/confirmation.aspx?familyId=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;displayLang=zh-cn"&gt;http://www.microsoft.com/downloads/zh-cn/confirmation.aspx?familyId=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;displayLang=zh-cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SharePoint2007：&lt;a href="http://www.microsoft.com/downloads/zh-cn/confirmation.aspx?familyId=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;displayLang=zh-cn"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=2e6e5a9c-ebf6-4f7f-8467-f4de6bd6b831&amp;amp;displayLang=zh-cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SharePoint 2007 序列号：F6YVR-4XY7K-RCVY4-37FBK-G44PY&lt;/p&gt;
&lt;p&gt;安装.NET Framework 3.0&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300714138.webp" alt="2011-01-08_215420" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;加载完后进入安装界面&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300715807.webp" alt="2011-01-08_215504" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;可以看到文件大小有39MB，需要连接网络下载，点击“安装”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300715905.webp" alt="2011-01-08_215730" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;等待下载完成&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300715941.webp" alt="2011-01-08_220523" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300715126.webp" alt="2011-01-08_220931" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;.NET Framework 3.0 已安装成功&lt;/p&gt;
&lt;h2 id="安装sharepoint-2007"&gt;安装SharePoint 2007&lt;/h2&gt;
&lt;p&gt;双击下载下来的exe文件
&lt;img src="https://img.fwhyy.com/2022/202201300715143.webp" alt="2011-01-09_001745" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300715762.webp" alt="2011-01-09_002829" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300715130.webp" alt="2011-01-09_002843" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;输入上面给出的序列号，点击“继续”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300716923.webp" alt="201101120951336913" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;选中“我接受此协议的条款”，点击继续&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300716524.webp" alt="2011-01-09_002948" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;点击“高级”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300716659.webp" alt="2011-01-09_003240" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;“服务器类型”选项卡中选中“完整…”，然后切换到“文件位置”选项卡&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300716328.webp" alt="2011-01-09_003313" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;文件位置可以选择你想放的目录，此处是使用默认位置，然后切换到“反馈”选项卡&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300716580.webp" alt="2011-01-09_003327" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;该处我选择的是“不参加”，点击“立即安装”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300716355.webp" alt="2011-01-09_003350" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;稍等片刻就安装完毕了&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300717282.webp" alt="2011-01-10_171910" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;点击“关闭”会提示重启，重启电脑后SharePoint 2007 就成功安装了。&lt;/p&gt;
&lt;p&gt;安装仅仅只是一个开始，配置乃至跟多的内容请关注我的后面的文章吧&lt;/p&gt;
&lt;h2 id="相关文章"&gt;相关文章&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://blog.fwhyy.com/2011/01/iis-install/"&gt;SharePoint2007安装图文详解一：安装IIS及相关组件&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2011/01/installation-of-ad-and-dns/"&gt;SharePoint2007安装图文详解二：安装AD（活动目录）及DNS&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2011/01/install-sqlserver2005/"&gt;SharePoint2007安装图文详解三：安装SqlServer2005&lt;/a&gt;
SharePoint2007安装图文详解四：安装.NET Framework 3.0和SharePoint 2007&lt;/p&gt;</description></item><item><title>Response.Redirect在新窗口打开 &amp;&amp; 3.0扩展方法</title><link>https://fwhyy.com/2009/01/response-redirect-in-a-new-window-open-3-0-extension-methods/</link><pubDate>Wed, 07 Jan 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/01/response-redirect-in-a-new-window-open-3-0-extension-methods/</guid><description>&lt;p&gt;Response.Rederect在默认情况下是在本页跳转，所以除了在js中用window.open 或是给A标签添加target属性之外，在后台似乎不能来打开新的页面，其实不然，通过设置form的target属性同样可以让Response.Rederect所指向的url在新的窗口打开。下面用三种方法来实现。&lt;/p&gt;</description></item><item><title>C#3.0学习(3)—匿名类型</title><link>https://fwhyy.com/2008/03/learning-csharp-3-0-3-anonymous-types/</link><pubDate>Sun, 09 Mar 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/03/learning-csharp-3-0-3-anonymous-types/</guid><description>&lt;p&gt;匿名类型是在初始化的时候根据初始化列表自动产生类型的一种机制，利用对象初始化器来创建匿名对象的对象。如:&lt;/p&gt;</description></item><item><title>C#3.0学习(2)—对象集合初始化器</title><link>https://fwhyy.com/2008/02/learning-c-3-0-2-object-collection-initializer/</link><pubDate>Mon, 25 Feb 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/02/learning-c-3-0-2-object-collection-initializer/</guid><description>&lt;p&gt;创建一个对象时可以包含一个对象初始化器或集合初始化器，用于初始化所创建对象的成员或新创建的集合的元素。使用初始化器可以让我们的代码变得更简洁。&lt;/p&gt;</description></item><item><title>C#3.0学习(1)—隐含类型局部变量和扩展方法</title><link>https://fwhyy.com/2008/02/learning-csharp-3-0-1-implied-type-of-local-variables-and-extension-methods/</link><pubDate>Fri, 22 Feb 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/02/learning-csharp-3-0-1-implied-type-of-local-variables-and-extension-methods/</guid><description>&lt;h2 id="隐含类型局部变量"&gt;隐含类型局部变量&lt;/h2&gt;
&lt;p&gt;隐含类型的局部变量是用var关键字来声明的，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;var i = 123;
var h=123.123;
var s = “oec2003&amp;#34;;
var intArr = new[] {1,2,3,4} ;
var a = new[] { 1, 10, 100, 1000 };
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;乍一看有点像javascript中的声明方式，虽然关键字一样但是有着本质区别。&lt;/p&gt;
&lt;p&gt;在c#3.0中用var关键字声明的变量被赋值后，在编译时编译器会根据变量值的类型自动推断出变量的类型。所以仍然是强类型，这点和object不同。其实var 关键字并不是一个具体的类型，只是起到了一个占位符的作用，编译后将替换成相应的类型。要注意的一点是用var声明的变量一定要赋初始值，否则会出现编译错误，因为如果不赋值就无法根据值来推断变量的类型。&lt;/p&gt;
&lt;p&gt;var只能声明局部变量，而且可以在foreach中使用，如：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;var nums=new []{1,2,3,4,5};
foreach(var i in nums)
{

}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="扩展方法"&gt;扩展方法&lt;/h2&gt;
&lt;p&gt;这是个非常有用的特性，扩展方法允许我们在不改变源码的情况下添加现有类型中的实例方法。扩展方法所在的类必须为静态类。如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public static class oec2003Extensions
{
 public static bool IsValidEmail(this String s)
 {
 Regex regex = new Regex(@&amp;#34;^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$&amp;#34;);
 return regex.IsMatch(s);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的IsValidEmail静态方法在静态类oec2003Extensions类中，这个类可以在任何的名称空间下，在要用的地方引用名称空间就行。IsValidEmail方法的作用是用来验证电子邮件。方法中有三个参数：this String s 。this只是一个编译上的要求，作为一个提示来告诉编译器此方法有可能作为扩展方法来使用；String就是我们需要扩展的类型；s则为要验证邮件的内容。下面来看看怎样来使用此扩展方法。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;protected void Button2_Click(object sender, EventArgs e)
{
 if (this.TextBox1.Text.Trim().IsValidEmail())
 {
 Response.Write(&amp;#34;email is right&amp;#34;);
 }
 else
 {
 Response.Write(&amp;#34;email is error&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;是不是很神奇，在string类型中就多了一个刚才添加的IsValidEmail方法，可以直接调用，用来实现邮件地址的验证。&lt;/p&gt;</description></item><item><title>DotNet 3.0 框架介绍</title><link>https://fwhyy.com/2007/08/dotnet-3-0-framework-introduce/</link><pubDate>Fri, 10 Aug 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/08/dotnet-3-0-framework-introduce/</guid><description>&lt;p&gt;微软.NET的最新版本，.NET Framework 3.0，为开发下一代业务解决方案软件系统开启了新的可能。它的设计目标是：提高生产力，降低基础设施复杂性，提供一个一致的元系统，让企业级服务、工作流解决方案和用户体验软件系统的开发更容易。&lt;/p&gt;</description></item></channel></rss>