一、C#简介
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
二:基本程序运行
using System;
namespace HelloWorldApplication
{
/* 类名为 HelloWorld */
class HelloWorld
{
/* main函数 */
static void Main(string[] args)
{
/* 我的第一个 C# 程序 */
Console.WriteLine("Hello World!");
Console.ReadKey();
}
}
}
1.using System:using 关键字用于在程序中包含 System 命名空间,一个程序一般有多个using 语句;
2.namespace声明:一个 namespace 是一系列的类,HelloWorldApplication 命名空间包含了类 HelloWorld;
3.class 声明:类 HelloWorld 包含了程序使用的数据和方法声明,类一般包含多个方法,方法定义了类的行为,在这里HelloWorld 类只有一个 Main 方法;
4.Main 方法:是所有 C# 程序的 入口点,Main 方法说明当执行时 类将做什么动作,Main 方法通过语句 Console.WriteLine("Hello World"); 指定了它的行为。
5.WriteLine 是一个定义在 System 命名空间中的 Console 类的一个方法,该语句会在屏幕上显示消息 “Hello,World!”;
Console.ReadKey(); 是针对 VS.NET 用户,这使得程序会等待一个按键的动作,防止程序从 Visual Studio .NET 启动时屏幕会快速运行并关闭。
三:基本语法
C#的基本语法大体于Java基础语法相似但是也有很多的不同
例如:输出用Console.WriteLine(); 会实现输出并换行,
如果不想换行就用Console.Write();
**using 关键字 :
在任何 C# 程序中的第一条语句都是:using System using 关键字用于在程序中包含命名空间,一个程序可以包含多个 using 语句,例如 我想用“sqlSugar”就可以用 using sqlSugar 实现。
C#的数据类型包括:值类型 、引用类型、指针类型
值类型:
值类型:
bool 布尔值
byte 8 位无符号整数
char 16 位 Unicode 字符
decimal 128 位精确的十进制值
double 64 位双精度浮点型
float 32 位单精度浮点型
int 32 位有符号整数类型
long 64 位有符号整数类型
sbyte 8 位有符号整数类型
short 16 位有符号整数类型
uint 32 位无符号整数类型
ulong 64 位无符号整数类型
ushort 16 位无符号整数类型
引用类型:
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。
Object是所有类型的基类:
对象(Object)类型 是 C# 中所有数据类型的终极基类Object 是 System.Object 类的别名。所以对象(Object)类型可以
被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
object obj;
obj = 20; //此操作实现了装箱操作
装箱: 将基本数据类型转换成引用数据类型
拆箱: 将引用数据类型转换成基本数据类型
-> 动态(Dynamic)类型
可以存储任何类型的值在动态数据类型变量中,这些变量的类型检查是在运行时发生的
声明动态类型的语法:dynamic <variable_name> = value;
例如:dynamic d = 20;
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的
类型检查是在运行时发生的
String 字符串定义的两种方式:
在C#中 String 类型可以有两种定义方式:
1.可以用“ ” 引号来定义
2.可以用 @ 来定义
例如:
string str = @"aaaa";
等价于:string str = "aaaa";
四:Java与C#的相似点:
Java与c 都实现了面向对象的思想(封装,继承,多肽)
五:Java与C#的区别:
1.在工具上,java主要用的idea C#主要用的VS
2.Java是开源的,因此在安全性能上是有一些欠缺的,C#经常应用于后台内部网络的开发,C#的安全性是很有保障的。
3.但是在市场上,很多大公司都选用java 在做web开发时候很强大,但是C#做窗体类的开发更好一些。
4.java跨平台是依靠虚拟机(JVM),C#只能在windows 和linux之间支持使用。
语法上的区别:
- 命名:C# 在命名空间用的是namespace,而java用的是package
- 控制流语句:c#跟Java类似,还有c#中的switch如果case后面有内容必须要有break;Java可以没有break;
- 访问修饰符:C#中的访问修饰符与Java中的基本对应,但多出了一个访问修饰符:C#中的访问修饰符与Java中的基本对应,但多出了一个internal--(internal:成员只能从同一程序集的内部访问)
- 数据类型:java中的String 类型首字母必须大写,C# 可以大写也可以小写。
java中的布尔类型是boolean C#的布尔类型是 bool - 集合:两种语言都有集合ArrayList,还有通过键访问值的 Java 中是HashMap而 c# 中是HashTable;c#比Java多泛型集合List<T>与Dictionary<K,V> 更容易了,无需拆箱装箱了,更安全;
- 继承:java用extends 关键字 而C# 只用一个 “ :”就可以了
- 接口实现:Java实现用关键字implements;c#用":"实现。
六:委托:
委托:是一个引用类型,其实是一个类型,保存方法的指针,指向的一个方法,当我们调用委托这个方法的时候,指向的这方法就立即会被执行。
1.定义委托:
delegate void HelloDelegate(String msg);//定义委托
//注意:定义委托可以写在类里面也可以写在类外面
2.创建委托实例:
HelloDelegate helloDelegate = new HelloDelegate(Hello);
3.定义一个被他指向的方法:
public static void Hello(String str) {
Console.WriteLine(str);
}
4.调用委托
helloDelegate("您好,委托!");
5.代码汇总:
delegate void HelloDelegate(String msg);//定义委托
internal class Program
{
private static void Main(string[] args)
{
HelloDelegate helloDelegate = new HelloDelegate(Hello);
helloDelegate("您好,委托!");
}
public static void Hello(String str) {
Console.WriteLine(str);
}
注意:委托的返回值类型要和方法的返回值类型一致,否则就会出现不一致的报错!
思考:直接调用不可以吗?为什么要用委托呢?
直接调用:
Hello("我不是委托!");
原因:
为了保证一个灵活性,可以先顶一个方法然后,用委托来传递,这样就很灵活,不需要把代码写死,目前框架中都在用委托。
注意:但是如果没有特殊要求,委托可以用接口来代替。
7.泛型委托:
委托本身其实是一个类,所以可以写类的地方就可以写委托。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
delegate void CSharpAdvancedDelegate<T>(T t);
public class CSharpAdvancedDelegate
{
public static void InvokeDelegate() {
CSharpAdvancedDelegate<string> cSharp = new CSharpAdvancedDelegate<string>(Method);
cSharp.DynamicInvoke("我是委托1号");
}
public static void Method(String str) {
Console.WriteLine(str);
}
}
}
实现了: 定义了一个委托就可以在很多方法都可以使用。
其实官方已经定义好了委托(不带返回值)
Action<string> action = new Action<string>(Method);
action.Invoke("我是官方委托1号");
带返回值:
Func<string,string> func = new Func<string,string>(Method3);
func("我是官方委托2号,带返回值!");
public static string Method3(String str)
{
return str;
}
之后的话都是用 Action 或者Func 不回去自己写委托。
8.多播委托:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
delegate void MulticastTest();
/// <summary>
/// 多播委托
/// 【1】每一个委托都是继承自MulticastDelegate,每一个都是多播委托。
/// 【2】 带返回值的多播委托只返回最后一个方法的值
/// 【3】多播委托可以用加减号来操作方法增加或者减少
/// 【4】给委托传递相同方法的时候,生成的委托实例也是相同的(也就是同一个委托)
/// </summary>
internal class MulticastDelegateTest
{
public void show() {
MulticastTest multicastDelegateTest = new MulticastTest(MethodTest);
multicastDelegateTest();
Action action = new Action(MethodTest);
action();
Func<string> func = new Func<string>(MethodTest2);
func();
}
public void MethodTest() {
Console.WriteLine("我是方法MethodTest");
}
public static string MethodTest2()
{
return "我是方法MethodTest2";
}
}
}
七:事件:
事件机制是基于多播委托的。
事件的本质:
事件是一种委托,具体的说来,事件是一种名为 EventHandler<TEventArgs> 的泛型委托。它是.NET为我们实现事件而专门提供的委托类(微软大法好)。其中的泛型类型 TEventArgs 代表着自定义事件的详细信息类。我们来看该委托的定义:
从定义中可看出,事件委托采用了两个参数: sender 和 泛型参数 TEventArgs。其中 sender 代表事件源,是object类型的,所以我们可以传入任何自定义的事件触发对象。第二个参数就是实例化该泛型委托时时传入的实际类型,代表着事件参数,它必须派生于 EventArgs 类,我们可以建立这个事件参数类,通过为该类添加自定义属性来加入任何你想要的事件信息。
未完待续…………
八:深入理解 C# .NET Core 中 async await 异步编程思想
详见:深入理解 C# .NET Core 中 async await 异步编程思想_qq_42799562的博客-CSDN博客_异步编程思想