C#入门

C#(C-Sharp)是一种现代、面向对象的编程语言,由微软开发,最初是为.NET框架设计的。它是一种类型安全、简洁且功能强大的语言,广泛用于开发桌面应用程序、Web应用程序、移动应用程序、游戏开发等。

1. 基本特性

  • 面向对象:C#是面向对象的编程语言,支持类、对象、继承、多态、封装等基本的面向对象概念。
  • 类型安全:C#是一种类型安全的语言,这意味着它会在编译时检查数据类型的正确性,避免常见的类型错误。
  • 垃圾回收:C#有自动垃圾回收机制(GC),这意味着开发者不需要手动管理内存分配和回收,减少了内存泄漏的风险。
  • 跨平台:通过.NET Core(现在是.NET 5及之后版本),C#支持在多个平台(Windows、Linux、macOS)上开发和运行应用。

2. 语言结构

  • 变量和数据类型:C#有一套丰富的内建数据类型,包括基本类型(如整数、浮点数、字符)、结构、枚举、数组等。
  • 控制结构:标准的控制结构如ifelseswitchforforeachwhile等。
  • 方法和函数:方法是C#中的核心,用来执行具体操作,可以有参数、返回值。
  • 委托和事件:C#支持委托(类似于函数指针),并用于事件驱动编程。

3. 面向对象编程(OOP)

  • 类和对象:C#的核心是类和对象。类是对象的蓝图,定义了对象的属性和行为。
  • 继承:允许子类继承父类的属性和方法。
  • 多态:通过继承或接口实现方法重写,允许不同对象对相同方法进行不同的实现。
  • 封装:通过访问修饰符(如privatepublic)控制对类成员的访问。

4. 异常处理

C#通过trycatchfinally块处理异常,提供了一种结构化的方式来捕获和处理运行时错误,确保程序不会因为错误而崩溃。

5. LINQ(语言集成查询)

C#的LINQ功能允许开发者以声明性的方式查询各种数据源(如数组、集合、数据库等),它使得数据操作更加简洁且易于理解。

6. C#与.NET

C#与.NET框架紧密结合,.NET提供了一整套丰富的类库和开发工具,使得C#成为开发Web应用、桌面应用、API、微服务、云服务等非常理想的选择。

  • ASP.NET:C#用来开发Web应用程序和Web API。
  • Xamarin:用C#开发跨平台移动应用。
  • Unity:C#在游戏开发中也非常流行,Unity引擎广泛使用C#进行游戏开发。

7. 异步编程

C#支持异步编程,通过asyncawait关键字,可以方便地进行异步操作,提升应用的响应能力和性能,尤其是在处理I/O密集型操作时(如文件读取、网络请求等)。

8. 跨平台与云开发

通过.NET Core(现为.NET 5及以后版本),C#实现了跨平台开发,允许在Windows、Linux、macOS等不同操作系统上运行程序。此外,C#也广泛应用于云开发,特别是在Azure云平台中。

9. 社区和生态

C#的社区活跃,微软和其他开发者社区不断推出新的库、工具和框架,支持开发者快速解决各种开发问题。GitHub、Stack Overflow等平台都有大量的资源供学习和参考。

C#的应用场景:

  • Web开发:利用ASP.NET开发网站和Web API。
  • 桌面应用:开发Windows桌面应用(使用WinForms或WPF)。
  • 移动应用:通过Xamarin开发跨平台的iOS和Android应用。
  • 游戏开发:使用Unity引擎开发游戏。
  • 企业应用:在企业级系统中,C#是构建高效、可靠应用的理想选择。

代码讲解

第一个简单的例子:打印“Hello, World!”

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, World!");
    }
}
解释:
  1. using System; 是导入一个命名空间,它提供了很多常用的功能,比如打印输出、读输入等。
  2. class Program 定义了一个类,类是C#程序的基本结构。
  3. static void Main() 是程序的入口点,C#的程序从这里开始执行。
  4. Console.WriteLine("Hello, World!"); 这行代码会在控制台输出一行文本。
接下来我们讲解一些C#的基本概念,比如变量、数据类型、运算符等。

1. 变量与数据类型

在C#中,我们需要声明变量,并指定它们的数据类型。常见的数据类型包括整数、浮动小数、字符、布尔值等。

using System;

class Program
{
    static void Main()
    {
        // 整数类型
        int age = 25;

        // 浮动小数类型
        double height = 1.75;

        // 字符类型
        char initial = 'J';

        // 布尔类型
        bool isStudent = true;

        // 输出变量的值
        Console.WriteLine("Age: " + age);
        Console.WriteLine("Height: " + height);
        Console.WriteLine("Initial: " + initial);
        Console.WriteLine("Is Student: " + isStudent);
    }
}
解释:
  1. int 表示整数类型,可以存储没有小数部分的数字。
  2. double 表示浮动小数类型,可以存储带小数点的数字。
  3. char 用来表示一个字符,通常是单引号包围的单个字符。
  4. bool 用来表示布尔值,值只有 truefalse

2. 操作符

C#支持许多常见的操作符,如加法、减法、乘法等。

例子:
using System;

class Program
{
    static void Main()
    {
        int a = 10;
        int b = 5;

        // 加法
        Console.WriteLine("a + b = " + (a + b));

        // 减法
        Console.WriteLine("a - b = " + (a - b));

        // 乘法
        Console.WriteLine("a * b = " + (a * b));

        // 除法
        Console.WriteLine("a / b = " + (a / b));

        // 取余
        Console.WriteLine("a % b = " + (a % b));
    }
}
解释:
  1. + 加法
  2. - 减法
  3. * 乘法
  4. / 除法
  5. % 取余(求余数)

3. 条件语句(ifelseswitch

条件语句用来根据不同的条件执行不同的代码。

例子:ifelse
using System;

class Program
{
    static void Main()
    {
        int number = 10;

        if (number > 0)
        {
            Console.WriteLine("The number is positive.");
        }
        else if (number < 0)
        {
            Console.WriteLine("The number is negative.");
        }
        else
        {
            Console.WriteLine("The number is zero.");
        }
    }
}
解释:
  1. if 用来检查条件是否为真,如果为真就执行相关代码。
  2. else if 用来检查另外一个条件,如果第一个条件不成立时会继续检查下一个条件。
  3. else 用来执行默认的代码,通常是当其他条件都不满足时。
例子:switch 语句
using System;

class Program
{
    static void Main()
    {
        int day = 3;

        switch (day)
        {
            case 1:
                Console.WriteLine("Monday");
                break;
            case 2:
                Console.WriteLine("Tuesday");
                break;
            case 3:
                Console.WriteLine("Wednesday");
                break;
            default:
                Console.WriteLine("Invalid day");
                break;
        }
    }
}
解释:
  1. switch 根据不同的值执行不同的代码,适合用来处理多个条件。
  2. 每个 case 都是一个条件,如果匹配上了,就会执行对应的代码。break 用来结束 switch 语句。

4. 循环语句(forwhileforeach

循环语句用于重复执行某些操作。

例子:for 循环
using System;

class Program
{
    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine("i = " + i);
        }
    }
}
解释:
  1. for 循环通常用来在一个范围内重复执行代码。i 是循环变量,初始化为 1,每次循环 i 增加 1,直到 i 大于 5。
  2. 循环会执行 5 次,输出 i = 1i = 5
例子:while 循环
using System;

class Program
{
    static void Main()
    {
        int i = 1;
        while (i <= 5)
        {
            Console.WriteLine("i = " + i);
            i++; // 增加 i 的值
        }
    }
}
解释:
  1. while 循环会在条件为真的时候继续执行,直到条件变为假。
  2. 这里,i 从 1 开始,直到 i 大于 5 时,循环停止。
例子:foreach 循环
using System;

class Program
{
    static void Main()
    {
        string[] fruits = { "Apple", "Banana", "Cherry" };

        foreach (string fruit in fruits)
        {
            Console.WriteLine(fruit);
        }
    }
}

5. 数组

数组用来存储多个相同类型的数据。在C#中,数组的大小是固定的。

例子:声明和使用数组
using System;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };

        // 访问数组中的元素
        Console.WriteLine("The first number is " + numbers[0]);
        Console.WriteLine("The last number is " + numbers[4]);

        // 遍历数组
        for (int i = 0; i < numbers.Length; i++)
        {
            Console.WriteLine("Number at index " + i + ": " + numbers[i]);
        }
    }
}
解释:
  1. 数组使用 [] 来声明,数组中的元素是有序的,可以通过索引来访问。
  2. numbers.Length 返回数组的长度,用来控制遍历的次数。

接下来我们继续学习一些更加进阶的概念,包括方法、类与对象、以及面向对象编程的基本原则。 

6. 方法(Functions)

方法是可以复用的代码块,它们执行某些操作并返回结果。在C#中,我们通过方法来封装逻辑,增强代码的可读性和可维护性。

例子:声明和使用方法
using System;

class Program
{
    // 声明一个方法,返回一个整数
    static int Add(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        int result = Add(5, 3); // 调用 Add 方法
        Console.WriteLine("The sum is: " + result);
    }
}
解释:
  1. static int Add(int a, int b) 是一个方法声明,int 表示返回类型,ab 是方法的参数。
  2. return a + b; 返回 ab 的和。
  3. Main 方法中,我们调用 Add(5, 3),并将返回的结果存储在 result 中。

7. 类与对象

C# 是一种面向对象编程语言。类是对象的模板,它定义了对象的属性和行为。

例子:创建一个类并实例化对象
using System;

class Car
{
    // 属性(字段)
    public string Make;
    public string Model;
    public int Year;

    // 方法(行为)
    public void Start()
    {
        Console.WriteLine("The car is starting.");
    }

    public void Stop()
    {
        Console.WriteLine("The car has stopped.");
    }
}

class Program
{
    static void Main()
    {
        // 创建一个 Car 类的对象
        Car myCar = new Car();
        myCar.Make = "Toyota";
        myCar.Model = "Corolla";
        myCar.Year = 2020;

        // 调用对象的方法
        myCar.Start();
        Console.WriteLine($"My car is a {myCar.Year} {myCar.Make} {myCar.Model}.");
        myCar.Stop();
    }
}
解释:
  1. Car 类有三个属性:Make(品牌),Model(型号),Year(年份),以及两个方法:Start()Stop()
  2. Main 方法中,我们创建了一个 Car 类的对象 myCar,并为它的属性赋值。
  3. 我们调用 myCar.Start()myCar.Stop() 方法来模拟启动和停止汽车。

8. 构造函数

构造函数是一个特殊的方法,用于初始化对象。当你创建一个新对象时,构造函数会自动调用。

例子:构造函数
using System;

class Car
{
    // 属性
    public string Make;
    public string Model;
    public int Year;

    // 构造函数
    public Car(string make, string model, int year)
    {
        Make = make;
        Model = model;
        Year = year;
    }

    // 方法
    public void Start()
    {
        Console.WriteLine("The car is starting.");
    }

    public void Stop()
    {
        Console.WriteLine("The car has stopped.");
    }
}

class Program
{
    static void Main()
    {
        // 创建 Car 类的对象并传递参数给构造函数
        Car myCar = new Car("Toyota", "Corolla", 2020);

        // 调用对象的方法
        myCar.Start();
        Console.WriteLine($"My car is a {myCar.Year} {myCar.Make} {myCar.Model}.");
        myCar.Stop();
    }
}
解释:
  1. public Car(string make, string model, int year) 是构造函数,它的作用是在对象创建时为属性赋初值。
  2. 当我们创建 Car 对象时,通过构造函数传递了 MakeModelYear 的值。

9. 继承

继承是面向对象编程的一个重要特性,它允许一个类继承另一个类的属性和方法。子类可以在继承父类的功能的基础上,进行扩展和修改。

例子:继承
using System;

class Animal
{
    public string Name;

    public void Eat()
    {
        Console.WriteLine($"{Name} is eating.");
    }
}

class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{Name} is barking.");
    }
}

class Program
{
    static void Main()
    {
        Dog myDog = new Dog();
        myDog.Name = "Buddy";
        myDog.Eat(); // 从 Animal 类继承来的方法
        myDog.Bark(); // Dog 类自己的方法
    }
}
解释:
  1. Dog 类继承了 Animal 类,因此它可以使用 Animal 类中的 Name 属性和 Eat() 方法。
  2. Dog 类新增了一个 Bark() 方法。
  3. 创建 myDog 对象后,它不仅能吃(继承自 Animal),还能叫(Dog 类特有的功能)。

10. 多态

多态是指一个对象可以通过父类的引用调用子类的方法。通过多态,程序可以动态决定调用哪个方法,增强了程序的灵活性。

例子:多态
using System;

class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("The animal makes a sound.");
    }
}

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("The dog barks.");
    }
}

class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("The cat meows.");
    }
}

class Program
{
    static void Main()
    {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.Speak();  // 输出:The animal makes a sound.
        myDog.Speak();     // 输出:The dog barks.
        myCat.Speak();     // 输出:The cat meows.
    }
}
解释:
  1. Speak() 方法在 Animal 类中是一个虚方法(virtual),意味着它可以被子类重写。
  2. DogCat 类分别重写了 Speak() 方法,实现了自己的版本。
  3. Main 方法中,我们用 Animal 类型的引用指向 DogCat 类的对象,展示了多态的特性:即便是 Animal 类型的引用,程序会根据实际对象的类型调用对应的 Speak() 方法。

继续深入学习,我们将探讨一些更高级的 C# 概念,如接口、异常处理、集合类型、LINQ 等。 

11. 接口(Interface)

接口是 C# 中的一种抽象类型,它定义了一组方法和属性,但不提供具体的实现。接口是面向对象编程中实现多态和解耦的常用方式。

例子:接口的使用
using System;

interface IDriveable
{
    void Start();
    void Stop();
}

class Car : IDriveable
{
    public void Start()
    {
        Console.WriteLine("The car is starting.");
    }

    public void Stop()
    {
        Console.WriteLine("The car has stopped.");
    }
}

class Program
{
    static void Main()
    {
        IDriveable myCar = new Car();
        myCar.Start();
        myCar.Stop();
    }
}
解释:
  1. IDriveable 是一个接口,定义了两个方法:Start()Stop(),但没有实现。
  2. Car 类实现了 IDriveable 接口,因此它必须提供 Start()Stop() 方法的具体实现。
  3. Main 方法中,我们通过接口 IDriveable 来操作 Car 对象,实现了面向接口编程。

12. 异常处理(Exception Handling)

异常处理用来处理程序运行时可能出现的错误。在 C# 中,我们使用 trycatchfinally 来捕获和处理异常。

例子:异常处理
using System;

class Program
{
    static void Main()
    {
        try
        {
            int result = 10 / 0;  // 会抛出除零异常
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine("Error: Cannot divide by zero.");
            Console.WriteLine(ex.Message);
        }
        finally
        {
            Console.WriteLine("This will always run.");
        }
    }
}
解释:
  1. try 块中放置可能引发异常的代码。
  2. catch 块用来捕获特定的异常并处理,例如这里捕获 DivideByZeroException
  3. finally 块的代码无论是否发生异常都会执行,常用来释放资源。

13. 集合类型

C# 提供了多种集合类型,常见的有 List<T>Dictionary<TKey, TValue>Queue<T>Stack<T> 等,它们用于存储和管理多个元素。

例子:使用 List
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> fruits = new List<string>();
        fruits.Add("Apple");
        fruits.Add("Banana");
        fruits.Add("Cherry");

        // 遍历 List
        foreach (string fruit in fruits)
        {
            Console.WriteLine(fruit);
        }

        // 移除元素
        fruits.Remove("Banana");

        // 查找元素
        Console.WriteLine("List contains 'Banana': " + fruits.Contains("Banana"));
    }
}
解释:
  1. List<T> 是一个泛型集合,可以存储任意类型的数据,并且具有动态大小。
  2. 使用 Add() 方法可以向 List 中添加元素,使用 Remove() 方法删除元素,使用 Contains() 方法检查是否包含某个元素。
例子:使用 Dictionary
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary<int, string> people = new Dictionary<int, string>();
        people.Add(1, "Alice");
        people.Add(2, "Bob");
        people.Add(3, "Charlie");

        // 查找元素
        Console.WriteLine("Person with ID 2: " + people[2]);

        // 遍历 Dictionary
        foreach (var person in people)
        {
            Console.WriteLine($"ID: {person.Key}, Name: {person.Value}");
        }
    }
}
解释:
  1. Dictionary<TKey, TValue> 是一个键值对集合,可以根据键(Key)快速访问值(Value)。
  2. 使用 Add() 方法向字典中添加元素,使用 [] 运算符根据键来查找元素。

14. LINQ(Language Integrated Query)

LINQ 是一种用于查询集合的强大工具,可以通过声明式的方式对数据进行操作。LINQ 可以用于数组、集合、数据库等数据源。

例子:使用 LINQ 查询集合
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // 使用 LINQ 查询偶数
        var evenNumbers = from num in numbers
                          where num % 2 == 0
                          select num;

        Console.WriteLine("Even numbers:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}
解释:
  1. 使用 fromwhereselect 语法,我们可以很方便地从集合中筛选出偶数。
  2. LINQ 的查询是懒加载的,只有在实际遍历结果时才会执行查询。

15. 属性(Property)

属性是 C# 中的一个概念,它允许你定义类的字段(数据成员),并为它们提供访问器(getter)和修改器(setter)。

例子:使用属性
using System;

class Person
{
    private string name;  // 私有字段

    // 公共属性
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

class Program
{
    static void Main()
    {
        Person person = new Person();
        person.Name = "John";  // 设置属性值
        Console.WriteLine("Person's name is: " + person.Name);  // 获取属性值
    }
}
解释:
  1. Name 是一个公共属性,使用 getset 访问器来控制对私有字段 name 的访问。
  2. 通过 person.Name = "John" 设置值,通过 person.Name 获取值。

16. 字符串操作

C# 提供了丰富的字符串操作方法,例如连接、拆分、替换、查找等。

例子:字符串操作
using System;

class Program
{
    static void Main()
    {
        string sentence = "Hello, world!";
        
        // 字符串连接
        string greeting = "Good " + "Morning";
        Console.WriteLine(greeting);  // 输出: Good Morning

        // 字符串替换
        string newSentence = sentence.Replace("world", "C#");
        Console.WriteLine(newSentence);  // 输出: Hello, C#!

        // 字符串拆分
        string[] words = sentence.Split(',');
        foreach (var word in words)
        {
            Console.WriteLine(word);  // 输出: Hello 和 world!
        }

        // 查找子字符串
        Console.WriteLine(sentence.Contains("world"));  // 输出: True
    }
}
解释:
  1. Replace() 方法用于替换字符串中的部分内容。
  2. Split() 方法根据指定的分隔符将字符串拆分成数组。
  3. Contains() 方法检查字符串中是否包含指定的子字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值