文章目录
c# 准备
配置环境(点击跳转
无法将文件obj\Debug*.exe复制到bin\Debug*.exe
c# 程序结构
- 一个c#程序主要包括以下部分:命名空间声明;一个class ;class方法;class属性;一个Main方法;语句&表达式;注释;
//例:
using System;
//按下Ctrl+F5编译运行;
namespace Test_for_C_
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello Wangdali");//输出结果:Hello Wangdali
//Console.WriteLine();//等待用户进行最后的按下任意键进行回车;
Console.ReadKey();//等待键盘输入,退出程序;使调试时能看到输出结果;若没有此句,命令窗口会一闪而过;这个语句在vscode中可能没有作用,因为控制台报:未处理的异常。 System.InvalidOperationException:当任一应用程序没有控制台或控制台输入已被重定向时,无法读取密钥。试试 Console.Read。
}
}
}
介绍代码中的各部分
- using System 使用命名空间;一个程序一般有多个using 语句;
- namespace声明:一个namesapce是一系列的类;命名空间Test_for_C_包含了类 Program;
- class声明:一个类包含了程序使用的数据和方法声明;类一般包含多个方法;方法定义类的行为;
- Main方法:是所有C#程序的入口点;其中,string[] args 的意思是:表示传递给main函数的字符序列数组;当用户通过操作系统的命令行运行应用程序时作为参数传递的字符串数组;
- /* */ 是一种注释方式;
- Console.ReadKey() 是针对vs.NET 用户的;这使得程序会等待一个按键的动作,防止程序从 Visual Studio .NET 启动时屏幕会快速运行并关闭。
注意
- c#大小写敏感;
- 必须分号;结尾;
- 程序的执行从Main方法开始;
- 与Java不同的是:文件名可以不同与不同类的名称;
- 属性和方法的区别在于——属性是存储在哈希键中的值,而方法是存储在哈希键中的函数;属性封装的是对象的数据,它用来获取对象私有字段的值;方法封装的是对象的行为,它用来改变对象的行为。
c#基本语法
//例:
using System;
//按下Ctrl+F5编译运行;
namespace Test_for_C_
{
class Rectangle
{
//比如说在类Rectangle中;它具有length和width属性;
double length;
double width;
public void Acceptt()
{
length = 4;
width = 5;
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("面积是:{0}", GetArea());
}
}
class NewRecTangle
{
static void Main(string[] args)
{
Rectangle r=new Rectangle();
r.Acceptt();
r.Display();
//Console.ReadLine();
}
}
}
注释
- 多行注释: /* */
- 单行注释//
- c#中引入的新XML注释,即我们在某个函数之前新起一行,输入/// VS.net 会自动增加XML 格式的注释;但别然调用你的代码时会提供智能感知;通常在Form。Designer.cs 窗口会自动生成 /// 注释的程序;
///<summary> ///</summary> 是必须要有的;
关键字
数据类型
- 数据类型可以分为:值类型、引用类型、指针类型;
- 内置的引用类型有:object dynamic string
类型转换
- 使用内置的类型转换方法;
- 使用类型之间的准换方法:Convert 和 Parse
using System;
namespace Test
{
class test
{
static void Main(string[] args)
{
int i = 1;
Console.WriteLine(i.ToString());
}
}
}
变量
接受来自用户的值
int num;
num=Convert.ToInt32(Console.ReadLine());//因为Console.ReadLine() 只能接受字符串格式的数据,所以需要将其转换为int类型;
常量
- 包括整数常量、浮点常量、字符常量、字符串常量、枚举常量;
运算符
- 逻辑运算符:&& || !
- 位运算符:
- 杂项运算符:sizeof typeof ?:
判断
if 语句
static void Main(string[] args)
{
int num=9;
//输入数据num后不能输出,可能是作者vscode仍需要配置;至今未解决;
num=Convert.ToInt32(Console.ReadLine());//因为Console.ReadLine() 只能接受字符串格式的数据,所以需要将其转换为int类型;
if(num>10) Console.WriteLine("num>10");
else Console.WriteLine("num<10");
}
switch 语句
public static void Main(string[] args){
char aa='a';
switch (aa){
case 'a':
Console.WriteLine("是a");
break;
case 'b':
Console.WriteLine("是b");
break;
default:
Console.WriteLine("default");
break;
//当然,switch也可以嵌套使用;
}
?:运算符
public static void Main(string[] args){
double num=1;
Console.WriteLine(num==1?true:false);
}
循环
- c#拥有多种循环类型:while循环、for/foreach循环、do…while循环、嵌套循环;
//while循环
static void Main(string[] args){
int Time=9;
while(Time<10){
if (Time<0) break;
Console.WriteLine("Time在递减:{0}",Time);
Time-=1;
}
//for 循环
for(int i=0;i<Time;i=i+1){
Console.WriteLine("a的值为{0}",Time);
}
//foreach
int[] Array = new int[] {1,2,3,4,5};
foreach (int i in Array){
Console.WriteLine(i);
}
}
c#封装
- 封装是指:把一个或者多个项目封闭在一个物理的或者逻辑的包中;为了防止对实现细节的访问;
- 抽象和封装;
- 封装采用访问修饰符来实现;可定义一个类成员的范围和可见性;c#支持的访问修饰符如下:public;private;protected;Internal;Protected Internal;
Public 访问修饰符
- 允许一个类将其成员变量和成员函数暴露给其他的函数和对象;任何公有成员可以被外部的类访问;
class test
{
public double a;
public int b;
public void Print()
{
Console.WriteLine("输出函数结果{0}", a);
}
}
class test2
{
static void Main(string[] args)
{
//先实例化对象;
test T = new test();
T.a=1f;
T.b=2;
Console.WriteLine(T.a);
}
}
范围比较
- Public:任何公有成员可以被外部的类访问;
- Private:只有在同一个类中的函数可以访问他的私有成员;
- Protected:该类的内部和继承类汇总可以访问;
- internal:同一个程序集的对象可以访问
- Protected internal :3 和 4 的病机;符合其中一条都可以访问;
c#方法
调用方法
递归方法调用
按值传参
引用传参
输出传参
- return 语句只能从函数中返回一个值;使用输出参数从函数中返回两个值;输出参数会把方法输出的数值赋给自己,其他方面与引用参数类似;
class Class1{
public void Funtion1(out int x,out int y){
x=3;
y=4;
}
}
class CLass2{
public static void Main(){
Class1 c1= new Class1();
//局部变量定义;
int a,b;
//调用函数来获取值;
c1.Funtion1(out a,out b);
Console.WriteLine(a);
Console.WriteLine(b);
}
}
c#可空类型NULLable
- c#提供了一个特定的数据类型,可空类型;除了表示基础值正常范围内的数值,还有一个NULL值;
- 在处理数据库和其他可能存在的元素的数据类型时,将无效的赋值给多种类型或者bool类型的功能特别丰富。可以未定义;
int? num1=null;
double? num2=new double();
空合并矛盾
- 如果第一个操作数的数值为NULL,则返回第二个操作数的数值;否则返回第一个操作数的数值;
using System;
namespace Test
{
class test
{
static void Main(string[] args)
{
double? num1=1;
double? num2=null;
double num3,num4;
num3=num1??3.5;
Console.WriteLine(num3);
num4=num2??3.5;
Console.WriteLine(num4);
//输出结果1 3.5;
}
}
}
数组Array
- 一维数组、多维数组、交错数组、传递数组给参数、参数数组、Array类;
//声明数组
double[] Array;
//初始化数组;
double[] Array=new double [10];
//赋值给数组;
double[] Array=new double [10];
Array[0]= 5;
//也可以在声明列表的同时给数组提交
double [] Array={ 1,3,5,6,9};
//初始化时提交;
double [] Array=new double [6]{1,3,4,5,6,7};
//也可以省略数组的大小;
double [] Array=new double []{1,3,4,5,6,7};
//也可以创建一个变量数组到一个变量数组中;这种情况下,目标和源会采用框架下的内存位置;
int[] Array = new int [] {1,2,3};
int[] newArray=Array;
//访问数组元素
Array类
- Array类是c#所有数组的基类;他是在System命名空间中定义;**Array类提供了各种用于数组的属性和方法;**
```csharp
using System;
namespace Test
{
class test
{
static void Main(string[] args)
{
double[] Array1=new double [] {1,2,3};
double[] Array2=Array1;
Array.Reverse(Array2);
//Array2.Reverse();
}
}
}
多维数组
//初始化二维数组
int[,]a=new int [3,4]{
{0,1,2,4},
{1,2,3,4},
{1,2,3,4}
};
//访问二维数组元素;
int[,]a=new int [3,4]{
{0,1,2,4},
{1,2,3,4},
{1,2,3,4}
};
int i=1,j=2;
Console.WriteLine("Array[{0},{1}]={2}",i,j,a[1,2]);
字符串String
string类的属性
- string类只有两个属性,注意属性和方法的区别;
char //在当前String对象中获取char对象的指定位置;
Length //在当前的String对象中获取字符数;
- String类有许多方法作用于String对象;
//这里举一个例子:
static void Main(string[] args)
{
string str1="Wangdali";
string str2="Alex";
if(String.Compare(str1,str2)==0){
Console.WriteLine(str1+"and"+str2+"are equal");
}
}
结构
特点:
- c#中的结构与传统的C或C++中的结构不同;
- 结构可带有方法、字段、索引、属性、运算符方法、事件;
- 结构可定义构造函数,不能定义析构函数;但是,不能为结构定义默认的构造函数;默认的构造函数是自动定义的,且不能呗改变;
- 与类不同,结构不能继承其他的结构或者类;
- 结构不能作为其他结构或者类的基础结构;
- 结构可以实现一个或者多个接口;
- 结构成员不能指定为abstract vitual 或者protected;
- 当使用new操作符创建一个结构对象时,会调用适当的构造函数来创建结构;与类不同的是,结构可以不适用new 操作符即可被实例化;
- 如果不适用new操作符,只有在所有的字段都被初始化后,字段才能被赋值,对象才能被使用;
类和结构的不同点
- 类是引用类型;结构是值类型;
- 结构不支持继承;
- 结构不能声明默认的构造函数;
struct Struct1{
public int num1;
public int num2;
}
枚举Enum
- 枚举是一组整形常量;
- c#枚举是值数据类型;即:枚举包含自己的值,且不能继承或传递继承;
类
类的定义
成员函数和封装
构造函数
public LIne(){ //构造函数
}
~Line(){ //析构函数
}
静态成员
- 当我们声明一个类成员是静态的,意味着无论多少个类的对象被创建,只会有一个该静态成员的副本;
- 静态关键字实例只有一个该成员的实例,因为动态变量可以定义常量,他们的值通过直接调用类而不需要创建类的实例来获取;动态变量可以在成员函数或类的定义进行外部初始化;你也可以在类的内部进行初始化;
class Class1{
public static int num1;//初始化默认为0;
}