C# 入门教程(C#语法- 1.程序结构)
首先编程语言是一门语言,就像汉语、英语一样都有它的基本语法,咱们接下来通过下面最小入门级示例讲下C#的程序结构。
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello, World!");
}
}
}
graph LR
C[程序结构] --> D[关键词]
C --> E[命名空间]
C --> H[类]
C --> G[方法:入口函数]
C --> F[代码块]
C --> K[修饰符]
关键词
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello, World!!");
}
}
}
C#有一些关键字用于定义语法结构和控制程序行为。以下是C#中常见的关键字列表:
- abstract:声明抽象类或抽象成员。
- as:类型转换运算符。
- base:表示基类的关键字。
- bool:布尔类型关键字。
- break:跳出循环或 switch 语句。
- byte:8 位无符号整数类型关键字。
- case:用于 switch 语句中的分支情况。
- catch:捕获异常。
- char:16 位 Unicode 字符类型关键字。
- checked:启用整数溢出检查。
- class:声明类。
- const:声明常量。
- continue:继续循环的下一次迭代。
- decimal:128 位精确浮点数类型关键字。
- default:默认值或默认情况。
- delegate:声明委托类型。
- do:循环语句的起始点。
- double:64 位浮点数类型关键字。
- else:条件语句的分支。
- enum:声明枚举类型。
- event:声明事件。
- explicit:声明显式转换运算符。
- extern:表示外部方法实现。
- false:表示布尔类型的假值。
- finally:无论是否发生异常都执行的代码块。
- fixed:固定指针的关键字。
- float:32 位浮点数类型关键字。
- for:循环语句。
- foreach:迭代集合的每个元素。
- goto:无条件跳转到标记的语句。
- if:条件语句。
- implicit:声明隐式转换运算符。
- in:用于传递参数或 foreach 语句中的迭代。
- int:32 位整数类型关键字。
- interface:声明接口。
- internal:在当前程序集内可见的成员。
- is:类型检查运算符。
- lock:同步访问共享资源。
- long:64 位整数类型关键字。
- namespace:声明命名空间。
- new:创建新对象或隐藏基类成员。
- null:表示空引用。
- object:所有类型的基类。
- operator:声明运算符。
- out:输出参数修饰符。
- override:重写基类方法。
- params:表示参数数组。
- private:私有访问级别。
- protected:受保护访问级别。
- public:公共访问级别。
- readonly:只读字段修饰符。
- ref:引用参数修饰符。
- return:返回方法的值。
- sbyte:8 位有符号整数类型关键字。
- sealed:阻止派生类的声明。
- short:16 位整数类型关键字。
- sizeof:获取数据类型的字节大小。
- stackalloc:在堆栈上分配内存。
- static:静态成员修饰符。
- string:字符串类型关键字。
- struct:声明值类型。
- switch:多路分支语句。
- this:当前实例的引用。
- throw:抛出异常。
- true:表示布尔类型的真值。
- try:尝试执行可能会发生异常的代码块。
- typeof:获取对象的 Type 对象。
- uint:32 位无符号整数类型关键字。
- ulong:64 位无符号整数类型关键字。
- unchecked:禁用整数溢出检查。
- unsafe:启用不安全代码块。
- ushort:16 位无符号整数类型关键字。
- using:引入命名空间或资源管理器。
- var:隐式类型关键字。
- virtual:允许派生类重写方法。
- void:表示不返回值的方法。
- volatile:指示字段可以由多个线程同时访问。
这些关键字都具有特定的语法和用途,可以根据需要在代码中使用它们。
命名空间
命名空间是针对类分组的过程,就像住宅一样,客厅里放茶几,卧室里放个床,主要是为了归类,使用起来更方便。 以下是框架中控制台类的定义,System 是一个命名空间,Console 是该命名空间中的一个类,WriteLine是该类的一个静态方法
namespace System
{
public class Console
{
public static void WriteLine(string line)
{
//输出到控制台。。。
}
}
}
类的调用方式一:
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello, World!");
}
}
}
类的调用方式二: 可使用 using 关键字,这样就不必使用完整的名称,如下例所示:
using System;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
类和对象
类是最基本的 C# 类型。 类是一种数据结构,通常由状态(字段)和操作(方法和其他函数成员)组成。 类为类的实例(亦称为“对象”)提供了定义。 以下是一个学生类的定义,并在控制台调用的完整示例:
using System;
public class Student
{
private string name;
private bool isPresent;
public Student(string name)
{
this.name = name;
isPresent = false;
}
public void SignIn()
{
isPresent = true;
Console.WriteLine(name + " 签到成功.");
}
}
class Program
{
static void Main()
{
// 创建学生对象
Student student1 = new Student("小王");
Student student2 = new Student("小张");
// 调用学生的签到方法
student1.SignIn();
student2.SignIn();
// 等待用户按下任意键退出程序
Console.ReadKey();
}
}
该代码中,首先定义了一个名为 Student
的学生类,其中包含一个私有字段 name
表示学生姓名,以及一个私有字段 isPresent
表示学生是否已签到。学生类还有一个公共构造函数,用于初始化学生姓名和签到状态,以及一个公共的签到方法 SignIn()
,该方法将 isPresent
标记为 true
并输出签到信息。
在 Main
方法中,创建了两个学生对象 student1
和 student2
,并通过调用 SignIn()
方法来实现签到操作。最后,使用 Console.ReadKey()
方法等待用户按下任意键退出程序。
方法:入口函数
当我们编写 C# 程序时,每个程序必须有一个特殊的方法叫做 Main
方法。这个方法是程序执行的入口点,在运行程序时会首先执行其中的代码。
更详细的介绍,点这里
代码块
在 C# 中,大括号 {}
起着以下几种作用:
- 代码块:大括号被用来创建代码块,也称为语句块。代码块是一组相关的语句,它们在逻辑上被视为一个整体。大括号将这些语句括起来,使它们成为一个封闭的单元。
using System;
class Program
{
static void Main(string[] args)
{
bool condition = true;
if (condition)
{
Console.WriteLine("条件成立");
Console.WriteLine("这是一个代码块");
Console.WriteLine("包含多个语句");
}
}
}
- 作用域:大括号还定义了一个作用域(scope),也称为局部作用域。在 C# 中,变量和对象只在其所属的作用域中可见和有效。通过使用大括号,我们可以创建新的作用域,并在其中声明局部变量。
using System;
class Program
{
static void Main(string[] args)
{
{
int value = 10; // 在该作用域中声明的变量
Console.WriteLine(value); // 输出:10
}
// value 不在这里可见
// 在这里访问 value 将会报错
}
}
- 控制结构:大括号常与控制结构(如
if
、for
、while
、switch
等)一起使用,指定这些结构的执行范围。条件语句或循环语句中的大括号包含了要执行的代码。
using System;
class Program
{
static void Main(string[] args)
{
bool condition = true;
if (condition)
{
Console.WriteLine("条件成立,执行这里的代码");
}
else
{
Console.WriteLine("条件不成立,执行这里的代码");
}
}
}
- 匿名类型和对象初始化器:在 C# 中,大括号还用于创建匿名类型和对象初始化器。通过在大括号中指定初始值,我们可以为匿名类型的属性或对象的属性赋初值。
using System;
class Program
{
static void Main(string[] args)
{
var person = new { Name = "Alice", Age = 25 }; // 匿名类型
Console.WriteLine(person.Name); // 输出:Alice
Console.WriteLine(person.Age); // 输出:25
MyClass obj = new MyClass { Property1 = 10, Property2 = "Hello" }; // 对象初始化器
Console.WriteLine(obj.Property1); // 输出:10
Console.WriteLine(obj.Property2); // 输出:Hello
}
}
class MyClass
{
public int Property1 { get; set; }
public string Property2 { get; set; }
}
总而言之,大括号用于创建代码块、定义作用域、指定控制结构的执行范围,以及在匿名类型和对象初始化器中提供初始值。它们帮助我们组织代码并影响变量的可见性和作用范围。
修饰符
在 C# 中,有以下几种常用的修饰符(modifiers),它们可以应用于类、方法、字段和属性等成员,用于控制其行为和可访问性:
好的,我将为您提供每种修饰符的使用场景和相应的完整可运行示例代码。
public
(公共的):- 使用场景:当希望将成员暴露给所有其他代码时使用。
- 示例代码:
using System;
public class MyClass
{
public void MyMethod()
{
Console.WriteLine("这是一个公共方法");
}
}
public class Program
{
public static void Main(string[] args)
{
MyClass myObject = new MyClass();
myObject.MyMethod();
}
}
private
(私有的):- 使用场景:当希望将成员限制在类内部使用时使用。
- 示例代码:
using System;
public class MyClass
{
private int myField;
private void MyMethod()
{
Console.WriteLine("这是一个私有方法");
}
public void AccessPrivateMember()
{
myField = 10;
MyMethod();
}
}
public class Program
{
public static void Main(string[] args)
{
MyClass myObject = new MyClass();
myObject.AccessPrivateMember();
}
}
protected
(受保护的):- 使用场景:当希望将成员限制在类及其派生类使用时使用。
- 示例代码:
using System;
public class MyBaseClass
{
protected int myField;
protected void MyMethod()
{
Console.WriteLine("这是一个受保护的方法");
}
}
public class MyDerivedClass : MyBaseClass
{
public void AccessProtectedMember()
{
myField = 10;
MyMethod();
}
}
public class Program
{
public static void Main(string[] args)
{
MyDerivedClass myObject = new MyDerivedClass();
myObject.AccessProtectedMember();
}
}
internal
(内部的):- 使用场景:当希望将成员限制在同一程序集内部使用时使用。
- 示例代码:
using System;
internal class MyClass
{
internal void MyMethod()
{
Console.WriteLine("这是一个内部方法");
}
}
internal class Program
{
private static void Main(string[] args)
{
MyClass myObject = new MyClass();
myObject.MyMethod();
}
}
static
(静态的):- 使用场景:当希望将成员与特定实例解耦,成为类级别的成员,并且不需要创建类的实例即可访问时使用。
- 示例代码:
using System;
public class MyClass
{
public static int myVariable;
public static void MyMethod()
{
Console.WriteLine("这是一个静态方法");
}
}
public class Program
{
public static void Main(string[] args)
{
MyClass.myVariable = 10;
MyClass.MyMethod();
}
}
readonly
(只读的):- 使用场景:当希望将字段标记为只能在声明时或构造函数中初始化,并且在运行时不可更改时使用。
- 示例代码:
using System;
public class MyClass
{
private readonly int myField;
public MyClass(int value)
{
myField = value;
Console.WriteLine("只读字段的值为:" + myField);
}
}
public class Program
{
public static void Main(string[] args)
{
MyClass myObject = new MyClass(10);
}
}
const
(常量):- 使用场景:当希望声明一个在编译时确定且不可更改的常量值时使用。
- 示例代码:
using System;
public class MyClass
{
public const int MY_CONSTANT = 100;
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("常量的值为:" + MyClass.MY_CONSTANT);
}
}
abstract
(抽象的):- 使用场景:当希望定义一个没有实际实现的类、方法或属性,需要在派生类中实现时使用。
- 示例代码:
using System;
public abstract class MyBaseClass
{
public abstract void MyMethod();
}
public class MyDerivedClass : MyBaseClass
{
public override void MyMethod()
{
Console.WriteLine("在派生类中实现的抽象方法");
}
}
public class Program
{
public static void Main(string[] args)
{
MyDerivedClass myObject = new MyDerivedClass();
myObject.MyMethod();
}
}
virtual
(虚拟的):- 使用场景:当希望将方法或属性定义为可在派生类中重写的基类成员时使用。
- 示例代码:
using System;
public class MyBaseClass
{
public virtual void MyMethod()
{
Console.WriteLine("基类中的虚拟方法");
}
public virtual int MyProperty { get; set; }
}
public class MyDerivedClass : MyBaseClass
{
public override void MyMethod()
{
Console.WriteLine("在派生类中重写的虚拟方法");
}
public override int MyProperty
{
get
{
return base.MyProperty * 2;
}
set
{
base.MyProperty = value;
}
}
}
public class Program
{
public static void Main(string[] args)
{
MyDerivedClass myObject = new MyDerivedClass();
myObject.MyMethod();
myObject.MyProperty = 10;
Console.WriteLine("派生类中的属性值为:" + myObject.MyProperty);
}
}
这些修饰符用于不同的场景,以控制成员的可见性、访问级别、是否允许派生类进行重写等。对于初学者来说,理解和正确使用这些修饰符对于设计和实现类、方法和其他成员非常重要。
总结
继续引用雷总的语录,不懂的没有关系,先跳过去,后面的学会了,前面的自然就看懂了
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明