C# 语言入门学习

目录

本篇文章大概介绍了C#语言,以下内容均来自官方文档,感兴趣的小伙伴可以持续关注。

C#语言介绍

C# 是一种新式编程语言, 面向对象,面向组件,类型安全。
开发人员可以利用C#语言生产再 .NET生态系统上运行的安全可靠的应用程序。

C# 几项有助于创建可靠持久的应用程序的功能:
  1. 垃圾回收 : 自动回收不可访问的未用对象所占用的内存;
  2. 可以为null的类型 : 可防范不引用已分配对象的变量;
  3. 异常处理 :提供了一种结构化且可扩展的方法进行错误检测和恢复;
  4. lambda表达式 : 支持函数编程技术;
  5. 语言集成查询(LINQ)语言 : 创建一个公共模式,用于处理来自任何源的数据;
  6. 异步操作语言 : 支持提供用于构建分布式系统的语法;
  7. 拥有统一类型系统,所有 C# 类型均继承自一个根 object 类型(包括int 和 double 等基元类型)
    共用通用运算,任何类型的值都可一致的进行存储,传输和处理;
  8. 支持用户自定义的引用类型和值类型;
    允许动态分配轻型结构和内嵌存储;
    支持泛型方法和类型,增强了类型安全性和性能。
    可提供迭代器,使集合类的实现者可以定义客户端代码的自定义行为。

C# 强调版本控制,确保程序和库以兼容方式随时间推移而变化

.NET体系结构

.NET 是名为公共语言运行时(CLR)的虚执行系统和一组库。

用C# 编写的源代码被编译成符合CLI 规范的中间语言(IL);存储在扩展名为 .dll的程序集中

	.NET 语言操作性: 利用 C#生成的IL代码可以与通过 .NET体系的其他与CTS兼容的语言进行交互
	.NET 包含大量的库. 这些库支持多种不同的工作负载. 
均已整理至命名空间中;包括文件输入输出, 字符串控制, XML分析, Web应用程序框架和Windows窗体控件

Hello World

用 C#写的第一个程序

using System;

class Hello
{
    static void Main()
    {
        Console.WriteLine("Hello World");
    }
}

Hello World程序始于引用 System命名空间的 using指令;声明的 Hello类只有一个成员,即Main方法
可以使用 this引用特定的封闭对象实例,而静态方法则可以在不引用特定对象的情况下运行。

按照约定, Main静态方法是 C#程序的入口点。输出有 System的 Console类的WriteLine方法生成。

类型和变量

C#包含两种类型:值类型和引用类型。
值类型的变量直接包含它们的数据。引用类型的变量存储对数据的引用。

C#类型系统分类

值类型
        1.简单类型
             -有符号整型: sbyte, short, int, long;
            -无符号整型: byte, unshort, uint, ulong;
            -Unicode字符: char, 表示UTF-16代码单元
            -IEEE二进制浮点: float, double;
            -高精度十进制浮点: decimal;
            -布尔值: bool;
        2.枚举类型
            enum E{...}格式
        3.结构类型
            struct S{...}格式
        4.可以为null的类型
            值为null类型的其他所有值类型的扩展
        5.元组值类型
            格式为(T1,T2,...)
引用类型
        1.类类型
            -其他所有类的最终基类: object ;
            -Unicode字符串: string
            -格式为 class C{...} 的用户定义类型
        2.接口类型
            -inteface I{...}
        3.数组类型
            -一维,多维和交错。int[], int[,], int[][];
        4.委托类型
            -格式为delegate int D{...}

C# 程序使用 类型声明 创建新类型。 类型声明指定新类型的名称和成员。
用户可定义以下六种 C# 类型:
类类型、结构类型、接口类型、枚举类型、委托类型和元组值类型。

    -class 类型定义包含数据成员(字段)和函数成员(方法、属性及其他)的数据结构。
     类类型支持单一继承和多形性,即派生类可以扩展和专门针对基类的机制。

    -struct 类型定义包含数据成员和函数成员的结构。 
     与类不同的是,结构是值类型,通常不需要进行堆分配。 
     结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 object。

    -interface 类型将协定定义为一组已命名的公共成员。 实现 interface 的 class
     或 struct 必须提供接口成员的实现代码。 
     interface 可以继承自多个基接口, class 和 struct 可以实现多个接口。

    -delegate 类型表示引用包含特定参数列表和返回类型的方法。 
     通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。
     委托类同于函数式语言提供的函数类型。 
     它们还类似于其他一些语言中存在的“函数指针”概念。 
     与函数指针不同,委托是面向对象且类型安全的。

     class、struct、interface 和 delegate 类型全部都支持泛型
C# 支持任意类型的一维和多维数组。

可以为 null 的类型不需要单独定义。 
    对于所有不可以为 null 的类型 T,都有对应的可以为 null 的类型 T?,
    后者可以包含附加值 null。 例如,int? 是可保存任何 32 位整数或 null 值的类型,
    string? 是可以保存任何 string 或 null 值的类型。

C# 采用统一的类型系统,因此任意类型的值都可视为 object。
    每种 C# 类型都直接或间接地派生自 object 类类型,而 object 是所有类型的最终基类。 
    在以下示例中,int 值被转换成 object,然后又恢复成 int。
    
    int i = 123;
    object o = i;    // Boxing
    int j = (int)o;  // Unboxing

程序结构

C# 中的关键组织结构概念包括程序、命名空间、类型、成员和程序集* 。
程序集的文件扩展名通常为 .exe 或 .dll,具体视其分别实现的是应用程序还是库而定

示例,考虑包含以下代码的程序集:

using System;

namespace Acme.Collections
{
    public class Stack<T>
    {
        Entry _top;
        
        public void Push(T data)
        {
            _top = new Entry(_top, data);
        }

        public T Pop()
        {
            if (_top == null)
            {
                throw new InvalidOperationException();
            }
            T result = _top.Data;
            _top = _top.Next;
            
            return result;
        }

        class Entry
        {
            public Entry Next { get; set; }
            public T Data { get; set; }
            
            public Entry(Entry next, T data)
            {
                Next = next;
                Data = data;
            }
        }
    }
}

此类的完全限定的名称为 Acme.Collections.Stack。
包含成员:一个 top 字段、两个方法(Push 和 Pop)和一个 Entry 嵌套类
Entry 嵌套类: 一个 next 字段、一个 data 字段和一个构造函数。

Stack 是泛型类。 它具有一个类型参数 T,在使用时替换为具体类型。

由于程序集是包含代码和元数据的自描述功能单元,因此无需在 C# 中使用 #include 指令和头文件。
只需在编译程序时引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共类型和成员。
例如,此程序使用 acme.dll 程序集中的 Acme.Collections.Stack 类:

using System;
using Acme.Collections;

class Example
{
    public static void Main()
    {
        var s = new Stack<int>();
        s.Push(1); // stack : 1
        s.Push(10); // stack : 1, 10
        s.Push(100); // stack : 1, 10, 100
        Console.WriteLine(s.Pop()); // stack : 1, 10
        Console.WriteLine(s.Pop()); // stack : 1
        Console.WriteLine(s.Pop()); // stack : null
    }
}

若要编译此程序,需要引用包含前面示例中定义的堆栈类的程序集。

总结

  • C# 程序可以存储在多个源文件中。 在编译 C# 程序时,将同时处理所有源文件,并且源文件可以自由地相互引用。
  • 从概念上讲,就好像所有源文件在被处理之前都连接到一个大文件。
  • 在 C# 中永远都不需要使用前向声明,因为声明顺序无关紧要(极少数例外情况除外)。
  • C# 并不限制源文件只能声明一种公共类型,也不要求源文件的文件名必须与其中声明的类型相匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值