赞
踩
一、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 都实现了面向对象的思想(封装,继承,多肽)
1.在工具上,java主要用的idea C#主要用的VS
2.Java是开源的,因此在安全性能上是有一些欠缺的,C#经常应用于后台内部网络的开发,C#的安全性是很有保障的。
3.但是在市场上,很多大公司都选用java 在做web开发时候很强大,但是C#做窗体类的开发更好一些。
4.java跨平台是依靠虚拟机(JVM),C#只能在windows 和linux之间支持使用。
委托:是一个引用类型,其实是一个类型,保存方法的指针,指向的一个方法,当我们调用委托这个方法的时候,指向的这方法就立即会被执行。
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("我不是委托!");
原因:
为了保证一个灵活性,可以先顶一个方法然后,用委托来传递,这样就很灵活,不需要把代码写死,目前框架中都在用委托。
注意:但是如果没有特殊要求,委托可以用接口来代替。
委托本身其实是一个类,所以可以写类的地方就可以写委托。
- 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 不回去自己写委托。
- 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 异步编程思想_qq_42799562的博客-CSDN博客_异步编程思想
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。