博客园 在那广阔的草原上

---是一片荣耀之地

导航

C#介绍,想学C#的朋友可以看一下

 

C#(发音为C Sharp)是由微软公司所开发的一种面向对象,且运行于.NET Framework之上的高级程序设计语言。并且成为ECMA与ISO标准规范。C#看似基于C++写成,但又融入其它语言如Delphi、Java、VB等。


设计目标

ECMA标准列出的C#设计目标:

  • C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言
  • 此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种自动内存释放技术)。软件必须做到强大、持久,并具有较强的编程生产力。
  • 此种语言为在分布式环境中的开发提供适用的组件开发应用。
  • 为使程序员容易迁移到这种语言,源代码的可移植性十分重要,尤其是对于那些已熟悉C和C++的程序员而言。
  • 对国际化的支持非常重要。
  • C#适合为独立和嵌入式的系统编写程序,从使用复杂操作系统的大型系统到特定应用的小型系统均适用。
  • 虽然C#程序在存储和操作能力需求方面具备经济性,但此种语言并不能在性能和尺寸方面与C语言或汇编语言相抗衡。

语言特性

相对于C和C++,这个语言在许多方面进行了限制和增强:

  • 指针(Pointer)只能被用于不安全模式。大多数对象访问通过安全的引用实现,以避免无效的调用,并且有许多算法用于验证溢出,指针只能用于调用值类型,以及受垃圾收集控制的托管对象。
  • 对象不能被显式释放,代替为当不存在被引用时通过垃圾回收器回收。
  • 只允许单一继承(single inheritance),但是一个类可以实现多个接口(interfaces)。
  • C#比C++更加类型安全。默认的安全转换是隐含转换,例如由短整型转换为长整型和从派生类转换为基类。而接口同整型,及枚举型同整型不允许隐含转换,非空指针(通过引用相似对象)同用户定义类型的隐含转换必段被显式的确定,不同于C++的复制构造函数。
  • 数组声明语法不同("int[] a = new int[5]" 而不是 "int a[5]")。
  • 枚举位于其所在的命名空间中。
  • C#中没有模版(Template),但是在C# 2.0中引入了泛型(Generic programming),并且支持一些C++模版不支持的特性。比如泛型参数中的类型约束。另一方面,表达式不能像C++模版中被用于类型参数。
  • 属性支持,使用类似访问成员的方式调用。
  • 完整的反射支持。

 

 C# 2.0 的特性

针对于.NET SDK 2.0(相对应于ECMA-334 标准第三版),C# 的新特性有:

 

分部类

分部类将类型的实现分在多个文件中。 它允许切分非常大的类,并且如果类的一部分是自动生成的方面也很有用处。

file1.cs:

public partial class MyClass
{
    public void MyMethod1()
    {
        // implementation
    }
}

file2.cs:

public partial class MyClass
{
    public void MyMethod2()
    {
        // implementation
    }
}

 

泛型

泛型, 或参数化类型, 是被C#支持的.NET 2.0特性。不同于C++模版, .NET 参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行. 它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,NET generics 使用 具化 生成泛型参数, 它允许优化和保存类型信息.[1]

 

 静态类

静态类它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。

 

 迭代器

一种新形式的迭代器 它提供了函数式编程中的generator,使用yield return


类似于Python中使用的yield

// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
    foreach (int i in numbers)
    {
        if (i % 2 == 0) yield return i;
    }
}

 

匿名方法

匿名方法类似于函数式编程中的闭包。[2]

public void Foo(object parameter) {
    // ...
 
    ThreadPool.QueueUserWorkItem(delegate
    {
        // anonymous delegates have full access to local variables of the enclosing method
        if (parameter == ...)
        { 
            // ... 
        }
 
        // ...
    });
}

 

委托的协变和逆变

委托签名的协变和逆变,[3]

 

属性访问器可以被单独设置访问级别

例子:

string status = string.Empty;
 
public string Status
{
    get { return status; }             // anyone can get value of this property,
    protected set { status = value; }  // but only derived classes can change it
}

 

可空类型

可空类型 (跟个问号, 如 int? i = null;) 允许设置 null 给任何类类型。

int? i = null;
object o = i;
if (o == null)
    Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");
else
    Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");

 

  ??操作符

(??) 用于如果类不为空值时返回它自身,如果为空值则返回之后的操作

object nullObj = null; 
object obj = new Object(); 
return nullObj ?? obj; // returns obj

主要用作将一个可空类型赋值给不可空类型的简便语法

int? i = null;
int j = i ?? 0; // Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.


 

 C# 3.0 的特性

C# 作为当前版,发布于 19 November 2007,是.NET Framework 3.5 的一部分, 它的新特性灵感来自于函数式编程语言,如:Haskell 和 ML,并广泛地引入了Language Integrated Query (LINQ) 模式到通用语言运行时中e.[4]

 

Linq

Language Integrated Query:[5] "from, where, select" context-sensitive keywords allowing queries across SQL, XML, collections, and more. These are treated as keywords in the LINQ context, but their addition won't break existing variables named from, where, or select.

 

 类型初始化器

Customer c = new Customer();
c.Name = "James";

可写作:

Customer c = new Customer { Name="James" };

 

集合初始化器

MyList list = new MyList();
list.Add(1);
list.Add(2);

可写作

MyList list = new MyList { 1, 2 };

假设 MyList 实现了 System.Collections.IEnumerable 且有一个Add 方法method[6]

 

Anonymous types

var x = new Customer { Name="James" };

 

 局部变量类型推断

局部变量 类型推断:

var x = new Dictionary<string, List<float>>();

等同于

Dictionary<string, List<float>> x = new Dictionary<string, List<float>>

它只是一个语法糖, 这个特性被匿名类型声明时所需要

 

Lambda表达式

Lambda表达式指:

listOfFoo.Where(
    delegate(Foo x) {
        return x.Size > 10; 
    }
)
可写作
listOfFoo.Where(x => x.Size > 10);

编译器翻译Lambda表达式为强类型委托或强类型表达式树.

 

 自动化属性

编译器将自动生成私有变量和适当的getter(get访问器)和setter(set访问器),如:

public string Name {
    get; 
    private set; 
}

 

 扩展方法

扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中:

public static class IntExtensions
{
    public static void PrintPlusOne(this int x) 
    {
        Console.WriteLine(x + 1);
    }
}
 
int foo = 0;
foo.PrintPlusOne();

 

 局部方法

Allow codegenerators to generate method declarations as extension points that are only included in the source code compilation if someone actually implements it in another portion of a partial class.[7]

  1. 局部方法 (Partial methods) 必须定义在局部类 (partial classes) 中
  2. 定义局部方法 需要用 partial 做修饰符
  3. 局部方法不一定总是有执行内容的,也就是说定义的方法 可以一句操作语句都没有
  4. 局部方法返回值必须是void
  5. 局部方法可以是静态 (static) 方法
  6. 局部方法可以包含参数,参数可以包含以下修饰词:this,ref,params
  7. 局部方法必须是私有 (private) 方法

例子:

partial class C
{
    static partial void M(int i); // defining declaration
}
partial class C
{
    static partial void M(int i)
    {
        dosomething();
    }
}

 

 程序的执行

C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称之为通用语言运行时.NET CLR(Common Language Runtime)——执行。

所有的.Net编程语言都被编译成这种被称为MSIL(Microsoft Intermediate Language )的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。但是实际上,如果计算机上没有安装.Net Framework,那么这些程序将不能够被执行。

在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。

 

 标准化

微软公司已经向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。现在有一些独立的实现正在进行,包括:

  • 自由软件基金会的dotGNU Portable.NET
  • Mono
  • Baltie - C# IDE for children and young Baltie

 

 C#的Hello World程式

下面是一个在命令行上输出Hello World的小程序,这种程序通常作为开始学习程序语言的第一个步骤:

using System;
class HelloWorld
{
  public static void Main()
  {
    Console.WriteLine("Hello, world!");
  }
}

 

 实现

C# 有5个著名的编译器(compilers):

  • 最标准的 C# 的实现当属微软自己推出、并被包含在 .NET Framework 内的 C# 编译器。
  • 微软的Rotor项目(Rotor Project)(目前称为 Shared Source Common Language Infrastructure),提供了 通用语言运行时(Common Language Runtime)的实现与 c# 编译器。
  • 由 Novell 赞助的 Mono 项目提供了 C# 编译器,同时也接近百分之百地实现了.NET Framework类库。
  • Dot GNU 项目也提供了另一个自由版本的 C# 编译器, 也提供了.NET Framework类库的实现。
  • Borland 提供了项目级的 C# 集成开发环境,内部所使用的编译器仍是微软.NET Framework所提供的 C# 编译器(这也意味着你仍须安装微软的.NET Framework。产品: C# Builder(商业版本),Turbo C# Explorer(免费版本)。

 

 参见

  1. ^ An Introduction to C# Generics
  2. ^ Anonymous Methods (C#)
  3. ^ Covariance and Contravariance in Delegates (C#)
  4. ^ Tim Anderson(November 14 2006).C# pulling ahead of Java - Lead architect paints rosy C# picture.Reg Developer.The Register.于2007年1月20日查阅.
  5. ^ (英文)LINQ.Microsoft MSDN(2007年).于2007年8月13日查阅.
  6. ^ The Mellow Musings of Dr. T : What is a collection?
  7. ^ Partial Methods.于2007年10月6日查阅.

 

 

posted on 2009-06-08 17:20  木法沙  阅读(3803)  评论(0编辑  收藏  举报