在这一章中,我们将深入探讨C#的基本语法,这是任何想要掌握这门语言的人都必须理解的核心概念。C#是一种现代、通用、面向对象的编程语言,它结合了C和C++的优秀特性,并添加了一些新的元素来简化开发过程。
变量与数据类型
声明变量
在C#中,声明一个变量需要指定变量的类型以及变量名。例如:
int age; string name;
这里我们声明了一个整型变量age和一个字符串类型的变量name。
数据类型
C#的数据类型可以分为两大类:值类型和引用类型。
值类型
值类型包括数值类型、布尔类型和结构类型等。这些类型的变量直接存储数据的值。例如:
byte myByte = 255; // 无符号8位整数 short myShort = -32768; // 有符号16位整数 long myLong = 9223372036854775807; // 有符号64位整数 float myFloat = 3.14f; // 单精度浮点数 double myDouble = 3.141592653589793238; // 双精度浮点数 bool myBool = true; // 布尔值 char myChar = 'A'; // 字符 decimal myDecimal = 123.45m; // 高精度浮点数
引用类型
引用类型包括类、接口、数组、委托等。引用类型不直接存储数据,而是存储指向数据的引用。例如:
string message = "Hello, World!"; object obj = new object();
变量的作用域
变量的作用域决定了它在代码中的可见性和生命周期。C#中有三种作用域:全局作用域、局部作用域和块作用域。
- 全局作用域:在类外部声明的变量。
- 局部作用域:在方法或语句块内部声明的变量。
- 块作用域:在特定代码块(如if语句或循环体)内部声明的变量。
// www.javascriptcn.com code example
class Program
{
static int globalVar = 10; // 全局作用域
static void Main(string[] args)
{
int localVar = 20; // 局部作用域
if (true)
{
int blockVar = 30; // 块作用域
}
// Console.WriteLine(blockVar); // 错误,blockVar在此处不可见
}
}控制流语句
控制流语句用于改变程序执行的顺序。C#提供了多种控制流语句,包括条件语句和循环语句。
条件语句
if 语句
if语句允许根据条件执行不同的代码块。
// www.javascriptcn.com code example
int number = 10;
if (number > 0)
{
Console.WriteLine("Number is positive.");
}
else if (number < 0)
{
Console.WriteLine("Number is negative.");
}
else
{
Console.WriteLine("Number is zero.");
}switch 语句
switch语句用于基于一个表达式的值执行不同的代码块。
// www.javascriptcn.com code example
int dayOfWeek = 3;
switch (dayOfWeek)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
default:
Console.WriteLine("Other day");
break;
}循环语句
while 循环
while循环会重复执行一段代码,直到给定的条件不再满足。
int count = 0;
while (count < 5)
{
Console.WriteLine($"Count: {count}");
count++;
}do-while 循环
do-while循环类似于while循环,但它至少会执行一次循环体内的代码。
int counter = 0;
do
{
Console.WriteLine($"Counter: {counter}");
counter++;
} while (counter < 5);for 循环
for循环适用于已知迭代次数的情况。
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Iteration {i}");
}foreach 循环
foreach循环用于遍历集合中的每个元素。
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}方法
方法是执行特定任务的一段代码。它们可以接受参数并返回结果。
定义方法
定义方法时,需要指定返回类型、方法名以及可能的参数列表。
static int Add(int a, int b)
{
return a + b;
}调用方法
可以通过方法名和传递适当的参数来调用方法。
int sum = Add(10, 20); Console.WriteLine(sum); // 输出:30
参数
C#支持多种参数类型,包括值参数、引用参数和输出参数。
值参数
默认情况下,参数按值传递,这意味着方法接收到的是原始值的一个副本。
void Increment(int number)
{
number++;
}
int num = 10;
Increment(num);
Console.WriteLine(num); // 输出:10引用参数
通过使用ref关键字,参数可以按引用传递,这样方法可以直接修改原始变量。
void Increment(ref int number)
{
number++;
}
int num = 10;
Increment(ref num);
Console.WriteLine(num); // 输出:11输出参数
out参数允许方法返回多个值。这些参数必须在调用方法之前初始化。
// www.javascriptcn.com code example
void GetValues(out int a, out int b)
{
a = 1;
b = 2;
}
int x, y;
GetValues(out x, out y);
Console.WriteLine($"{x}, {y}"); // 输出:1, 2数组
数组是存储一组相同类型数据的容器。
创建数组
创建数组的方法有两种:使用数组字面量或者指定大小。
// 使用数组字面量
int[] numbers = { 1, 2, 3, 4, 5 };
// 指定大小
string[] names = new string[3];
names[0] = "Alice";
names[1] = "Bob";
names[2] = "Charlie";访问数组元素
可以使用索引来访问数组中的元素。
int firstNumber = numbers[0]; // 获取第一个元素 string secondName = names[1]; // 获取第二个元素
多维数组
多维数组可以用来表示矩阵或其他多维度的数据结构。
// www.javascriptcn.com code example int[,] matrix = new int[3, 3]; matrix[0, 0] = 1; matrix[0, 1] = 2; matrix[0, 2] = 3; matrix[1, 0] = 4; matrix[1, 1] = 5; matrix[1, 2] = 6; matrix[2, 0] = 7; matrix[2, 1] = 8; matrix[2, 2] = 9;
数组操作
C#提供了许多内置方法来处理数组,例如排序和搜索。
Array.Sort(numbers); // 对数组进行排序 int index = Array.IndexOf(numbers, 3); // 查找元素的位置
类与对象
类是对象的蓝图,而对象则是类的实例。类定义了对象的状态和行为。
定义类
使用class关键字定义一个新的类。
// www.javascriptcn.com code example
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
}
}创建对象
通过使用new关键字和类的构造函数来创建对象。
Person person = new Person(); person.Name = "John"; person.Age = 30; person.SayHello(); // 输出:Hello, my name is John and I am 30 years old.
构造函数
构造函数是在创建对象时自动调用的方法。它们通常用于初始化对象的属性。
// www.javascriptcn.com code example
public class Student
{
public string Name { get; private set; }
public int Grade { get; private set; }
public Student(string name, int grade)
{
Name = name;
Grade = grade;
}
}
Student student = new Student("Alice", 10);继承
继承允许一个类从另一个类派生,从而继承其属性和方法。
// www.javascriptcn.com code example
public class Teacher : Person
{
public string Subject { get; set; }
public void Teach()
{
Console.WriteLine($"I teach {Subject}.");
}
}
Teacher teacher = new Teacher();
teacher.Name = "Mr. Smith";
teacher.Age = 40;
teacher.Subject = "Math";
teacher.SayHello(); // 继承自Person类的方法
teacher.Teach(); // Teacher类特有的方法接口
接口定义了一组方法和属性,但不提供实现。实现接口的类必须提供接口所声明的所有成员的实现。
// www.javascriptcn.com code example
public interface IAnimal
{
void MakeSound();
}
public class Dog : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Woof!");
}
}
public class Cat : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Meow!");
}
}
Dog dog = new Dog();
Cat cat = new Cat();
dog.MakeSound(); // 输出:Woof!
cat.MakeSound(); // 输出:Meow!异常处理
异常处理允许程序在发生错误时优雅地处理问题,而不是崩溃。
try-catch 结构
使用try-catch结构捕获和处理异常。
try
{
int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Cannot divide by zero!");
}finally 块
finally块确保某些代码在任何情况下都会被执行,即使发生了异常。
// www.javascriptcn.com code example
try
{
int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Cannot divide by zero!");
}
finally
{
Console.WriteLine("Finally block executed.");
}throw 关键字
使用throw关键字可以手动抛出异常。
// www.javascriptcn.com code example
public void CheckAge(int age)
{
if (age < 0)
{
throw new ArgumentOutOfRangeException("Age cannot be negative.");
}
}
CheckAge(-1);总结
这一章涵盖了C#的基本语法,包括变量与数据类型、控制流语句、方法、数组、类与对象以及异常处理。掌握了这些基本概念后,你将能够编写更复杂和功能丰富的C#程序。接下来,我们可以进一步探讨更多高级主题,如泛型、委托和事件等。