C#基础与Java的对比

一、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博客_异步编程思想

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值