C#基础与Java的对比

2023-11-04

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#基础与Java的对比 的相关文章

随机推荐

  • VC++判断CheckBox控件是否被勾选

    图示为CheckBox控件 控件重映射为m timed send 控件默认状态为未勾选 0 状态 所以勾选时取反即可 代码如下 void CHCCOMDlg OnTimedSend TODO Add your control notific
  • 御见安全态势感知:“哈里男孩”水坑攻击“脚本小子”

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 cocoyan odaywang 导语 水坑攻击是一种常见的高级攻击方法 电脑管家安全感知系统最近捕获到一例 分析如下 门前大桥下 游过一群鸭 快来快来数一数 二四六七八 Duc
  • OpenCL快速入门教程

    OpenCL快速入门教程 OpenCL快速入门教程 原文地址 http opencl codeplex com wikipage title OpenCL 20Tutorials 20 201 翻译日期 2012年6月4日星期一 这是第一篇
  • web服务中API接口响应过慢问题排查

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 使用Nginx uWSGI搭建web服务已经有半年时间了 最近经常会出现在某些时间段接口响应过慢的问题 一般要10几秒才能返回 有时候甚至是20 30s 这对前端APP来说
  • Activiti 工作流引擎 详解

    Activiti 工作流引擎 详解 1 Activiti工作流概述 1 1 工作流概述 1 2 工作流系统 1 3 Activiti概述 1 4 BPM 2 Activiti工作流环境搭建 3 Activiti 类 配置文件之间的关系 3
  • 操作系统——文件的基本操作

    创建文件 create系统调用 进行Create系统调用时 需要提供的几个主要参数 1 所需的外存空间大小 如 一个盘块 即1KB 2 文件存放路径 D Demo 3 文件名 这个地方默认为 新建文本文档 txt 操作系统在处理Create
  • 【华为OD机试】荒岛求生【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 有一个荒岛 只有左右两个港口 只有一座桥连接这两个港口 现在有一群人需要从两个港口逃生 有的人往右逃生 有的往左逃生 如果两个人相遇 则PK 体力值大的能够打赢体力值
  • html中hover有静止的命令,我可以通过JavaScript禁用CSS:hover效果吗?

    恐怕没有一个纯JavaScript的通用解决scheme JavaScript不能closuresCSS hover状态本身 不过你可以尝试下面的替代方法 如果您不介意在HTML和CSS中进行一些操作 则无需通过JavaScript手动重置
  • linux分区方案 1t,linux CentOS WEB服务器分区方案

    分区类型 分区的实际大小 解析 SWAP分区 2G 内存为1G 一般为内存的2倍 1G 2G 最少要150 250MB boot 32M 100M 启动分区 最多只要100M左右 opt 100M 1G 附加应用程序 tmp 40M 100
  • APT组织Lazarus近期攻击变化阐述

    Lazarus是来自朝鲜的APT组织 该组织长期对韩国 美国进行渗透攻击 此外还对全球的金融机构进行攻击 堪称全球金融机构的最大威胁 下面为近半年该组织的一些最新动态以及所使用的技术手段 Manuscrypt是该组织最常用的恶意软件家族 此
  • OpenCV VideoCapture.get()参数详解

    param define cv2 VideoCapture get 0 视频文件的当前位置 播放 以毫秒为单位 cv2 VideoCapture get 1 基于以0开始的被捕获或解码的帧索引 cv2 VideoCapture get 2
  • 4个点让你彻底明白Redis的各项功能

    4个点让你彻底明白Redis的各项功能 前言 先看一下Redis是一个什么东西 官方简介解释到 Redis是一个基于BSD开源的项目 是一个把结构化的数据放在内存中的一个存储系统 你可以把它作为数据库 缓存和消息中间件来使用 同时支持str
  • SIGPIPE的设计意图

    SIGPIPE的设计意图 SIGPIPE 是为以下这种情况设计的 grep pattern lt reallyhugefile head grep可能会输出成千上万行文本 但 head 只会读取前10行然后就退出 一旦head退出 grep
  • 《Pytorch深度学习和图神经网络(卷 1)》学习笔记——第八章

    本书之后的内容与当前需求不符合不再学习 信息熵与概率的计算关系 联合熵 条件熵 交叉熵 相对熵 KL散度 JS散度 互信息 无监督学习 监督训练中 模型能根据预测结果与标签差值来计算损失 并向损失最小的方向进行收敛 无监督训练中 无法通过样
  • 如何添加PYNQ-Z2板文件到Vivado

    添加板文件到vivado 先下载pynq z2板文件 PYNQZ2板文件 含约束文件 原理图 zip 下载后将文件复制到 Vivado安装目录 2018 3 data boards board files 重启vivado 完成
  • 重磅!AI与区块链技术知识分享交流会!特邀贾志刚老师、双一流211高校研究生!

    重磅 AI与区块链技术第一次知识交流分享会即将拉开帷幕 本交流会旨在分享交流人工智能 区块链相关内容 包括基础知识分享 前沿论文分享 具体项目实战 提供一个相同领域学者 工作人员在线交流机会 更多精彩内容 尽在微信公众号 AI与区块链技术
  • PCA算法

    https www cnblogs com dengdan890730 p 5495078 html PCA算法是怎么跟协方差矩阵 特征值 特征向量勾搭起来的 PCA Principle Component Analysis 主成份分析 是
  • 2023年7月31日-8月6日,(上午熟悉公司代码,周一到周五晚上优先工作所急视频教程,其他业余时间进行ue视频教程,为独立游戏做准备,本周10小时,合计2199小时,剩余7801小时)

    按照规划 上午熟悉公司源码 下午进行filament和ue渲染 晚上写工作代码 回家后泛读pbrt或者其他书籍催眠 业余学习ue的各种视频教程 为独立游戏做准备 累了就学其他视频教程 随意 可以按照ue 渲染 gt ue osg gt ue
  • testdbg-测试调试器

    http baidutech blog 51cto com 4114344 743464 testdbg 测试调试器 2011 02 24 14 07 00 标签 测试 休闲 调试器 职场 testdbg 原创作品 允许转载 转载时请务必以
  • C#基础与Java的对比

    一 C 简介 C 是微软公司发布的一种面向对象的 运行于 NET Framework之上的高级程序设计语言 C 看起来与Java有着惊人的相似 它包括了诸如单一继承 接口 与Java几乎同样的语法和编译成中间代码再运行的过程 但是C 与Ja