.Net Framework 4/C# 初识 C#

一、C# 专栏

        由于博主原先是做的Linux C/C++ 嵌入式领域,因此对 C# 也较为懵懂,C# 是典型的 OOP 编程,这一点与 C++ 类似,但是在语法上,C# 移除了对指针的运用以及内存管理,所以既不用考虑指针的复杂运用也不用考虑堆栈内存的手动释放。

        现在出于工作需要,不得不学习 C# 语言,但这块内容的资料我认为是比较有限的,无论是某站,还是二手书,对于深入的内容讲得是非常少的,在编程的时候,即便是按需查询也是相当耗费时间以及很难第一时间全部掌握的,所以开辟此专栏也是为了记录在学习过程中的涉及到的深入知识点。

        但为了将一些零碎的知识便于补充,还是在本章中,添加对 C# 基础知识的记录。

二、C# 基础知识

1、C# 标准输入输出函数

        Console 类表示控制台应用程序的标准输入流、输出流和错误流。

        Console 类中与输入/输出相关的方法如表所示:

方法

说明

Read()

从标准输入流读取下一个字符,返回 int 类型,只能记录 int 类型数据

ReadLine()

从标准输入流读取下一行字符,返回值为 string 类型

Write()

将指定的值写入标准输出流,输出后不换行

WriteLine()

将当前行终止符写入标准输出流,输出后换行

2、C# 数据类型(补充)

1、变量

        C# 中的变量类型根据其定义可以分为两种:一种是值类型,另一种是引用类型。值类型变量直接存储其数据值,主要包含整数类型、浮点类型以及布尔类型等,值类型变量在栈中进行分配;引用类型是构建 C# 应用程序的主要对象类型数据,在应用程序执行的过程中,预先定义的对象类型以 new 创建对象实例,并且存储在堆栈中。

1.1)值类型和引用类型

        值类型变量直接存储其数据值,主要包含整数类型、浮点类型以及布尔类型等。值类型变量在堆栈中进行分配。当以值类型作函数参数传递时,在函数内部改变形参的值,都不会改变实参原本的值。

        引用类型是构建 C# 应用程序的主要对象类型数据,引用类型必须使用 new 关键字来创建引用类型变量。当以引用类型作函数参数传递时,需要用到 ref 关键字,此时在函数内部改变形参的值,会改变实参原本的值。

1.2)装箱和拆箱

        将值类型转换为引用类型称为装箱,反之,将引用类型转换为值类型称为拆箱。

1.3)单精度浮点型

        单精度浮点型 float 的小数精确到第7位,但是 C# 默认小数为 double 型,因此,在需要使用 float 型数据时,需要在数值后面加上 f 或者 F 来强制其值为 float 类型。

1.4)金钱类型 decimal

        用来存储小数点超过16位(double)的数据类型:

        decimal a = 2000m;

        数据后面必须加一个 m 以区分数据类型,大小写均可以。

2、整数类型

        与 C++ 不同的是,C# 中有两个额外的整数类型:sbyte 表示8位有符号整数,取值范围为:-128~127 以及 byte 表示8位无符号整数,取值范围为:0~255。

        其余与 C++ 类似,只是无符号 unsigned 缩写为“u”,例如:uint、ushort等。

3、C# 类访问权限

1、类访问权限与 C++ 的区别

        C++中通过 public: 和 private: 的语法批量声明成员的访问权限,但 C# 要求每个成员单独指定访问修饰符。因此不用添加冒号,而且,默认访问权限是 private 私有的。

        例如有:

class Person
{public void func(int a){m_A = a;Console.WriteLine("这是一个C#代码函数打印 m_A = "+ m_A);Console.ReadKey();}private int m_A;
};

        C# 的类必须属于命名空间,没有全局作用域的类定义。

2、类对象的创建与 C++ 的区别

        类的创建不能简单的只创建类对象,而是应当用 new 的关键字方式创建。

3、类访问修饰符(访问权限)

        C# 中的访问修饰符主要包括 private、protected、internal、protected internal 和 public。主要区别如下表所示:

访问修饰符

应用范围

访问范围

private

所有类或者成员

只能在本类中访问

protected

类和内嵌的所有成员

在本类和其子类中访问

internal

类和内嵌的所有成员

在同一程序集中访问

protected internal

类和内嵌的所有成员

在同一程序集和子类中访问

public

所有类或者成员

任何程序都可以访问

        需要注意的是,在定义类时,只能使用 public 或者 internal,这取决于是否希望在包含类的程序集外部访问它。

        正常情况下不能把类定义为 private、protected 或者 protected internal 类型,但是可以使用它们定义嵌套的内部类(也就是在一个类中再声明一个类),则内部类总是可以访问外部的所有成员。

4、C# 数组

1、与 C/C++ 的区别  

        在 C/C++ 中声明一个数组时,中括号在数组名字的后面;而在 C# 中声明一个数组时,中括号在数组元素类型的后面。

        在 C# 中,声明数组后,还不能访问它的任何元素,因为声明数组只给出了数组名和元素的数据类型,要真正使用数组,还需要为它分配内存空间,在为数组分配内存空间时,必须指明数组的长度,为数组分配内存空间的语法格式如下:

        数组名称 = new 数组元素类型[数组元素的个数]

        也可以在声明的同时为数组分配内存空间:

        数组元素类型[] 数组名称 = new 数组元素类型[数组元素的个数]

2、一维数组的声明和使用

        一维数组的声明语法格式如下:

        type[] arrayName; //数组元素类型[] 数组名字

        一维数组的使用例如有:

int[] arr1;
arr1 = new int[10];int[] arr2 = new int[10];
int[] arr3 = new int[10]{1,2,3,4,5,6,7,8,9,10};
int[] arr4 = {1,2,3,4,5,6,7,8,9,10};

        可以使用 length 属性来获取数组的长度:arr1.length。

3、二维数组的声明和使用

        二维数组的声明语法格式如下:

        type[ , ] arrayName;

        type[][] arrayName;

        二维数组的使用例如有:

int[,] a = new int[2,4];	//定义一个两行四列的 int 类型的二维数组int[][] b = new int[2][];
b[0] = new int[2];
b[1] = new int[3];			//不规则的二维数组int[,] c = new int[,]{{1,2},{3,4}};

4、动态二维数组的声明和使用

        动态二维数组的声明语法格式如下:

        type[] arrayName;

        arrayName = new type[n1, n2, n3,,,,,,]

        动态二维数组的使用例如有:

int m = 2;
int n = 2;
int[,] a = new int[m,n];	// m 和 n 可以是任意值

5、C# 字符与字符串

        C# 的字符类 char 的使用和字符串类 string 的使用与 C++ 类似,不同的是 C# 的字符串类中封装了一些方法,这可以后续介绍。

6、C# 类

1、类的声明

        C# 中,类是使用 class 关键字来声明的,语法如下:

类修饰符 class 类名
{}

2、构造函数和析构函数

        C# 中的构造函数与析构函数同 C++ 类似,可以参考 C++ 中对象和类的类的构造函数和析构函数。

2.1)私有构造函数

        与 C++ 不同的是,在定义构造函数时,也可以使用 private 进行修饰,用于表示构造函数只能在本类中访问,在其它类中不能访问,但是,如果类中只定义了私有构造函数,将导致类不能使用 new 运算符在外部代码中实例化。

        然而,可以通过编写一个公共的静态属性或者方法来解决这个问题,例如有:

class Person
{private Person(){//私有构造函数}public static Person newPerson{return new Person();}static void Main(string[] args){Person p = new Person.newPerson();}
}

        使用私有构造函数可以实现一种常见的设计模式——单例模式,即同一类创建的所有对象都是同一个实例。

2.2)静态构造函数

        在 C# 中,可以为类定义静态构造函数,这种构造函数只执行一次,编写静态构造函数的主要原因是类有一些静态字段或属性,需要在第一次使用类之前从外部源中初始化这些静态字段和属性。

        在定义静态构造函数时,不能设置访问修饰符,因为其他 C# 代码从来不会调用它,它只在引用类之前执行一次,另外,静态构造函数不能带任何参数,而且一个类中只能有一个静态构造函数,它只能访问类的静态成员,不能访问实例成员。

        例如有:

namespace _4._3
{internal class Program{static Program(){Console.WriteLine("静态构造函数的调用");}private Program() {Console.WriteLine("私有构造函数的调用");}static void Main(string[] args){Program p1 = new Program();Program p2 = new Program();Program p3 = new Program();Console.ReadLine();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python趣学篇:Pygame实现粒子烟花绽放效果

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》🪐 目录 一、项目亮点与效果预览1. 核心特色功能2. 技术学习价值二、技术原理深度解析1. 向量运算:烟花运动的数学基…

NiceGUI 是一个基于 Python 的现代 Web 应用框架

NiceGUI 是一个基于 Python 的现代 Web 应用框架,它允许开发者直接使用 Python 构建交互式 Web 界面,而无需编写前端代码。以下是 NiceGUI 的主要功能和特点: 核心功能 1.简单易用的 UI 组件 提供按钮、文本框、下拉菜单、滑块、图表等常见…

Linux中的mysql逻辑备份与恢复

一、安装mysql社区服务 二、数据库的介绍 三、备份类型和备份工具 一、安装mysql社区服务 这是小编自己写的,没有安装的去看看 Linux换源以及yum安装nginx和mysql-CSDN博客 二、数据库的介绍 2.1 数据库的组成 数据库是一堆物理文件的集合,主要包括…

鸿蒙UI开发——组件的自适应拉伸

1、概 述 针对常见的开发场景,ArkUI开发框架提供了非常多的自适应布局能力,这些布局可以独立使用,也可多种布局叠加使用。本文针对ArkUI提供的拉伸能力做简单讨论。 拉伸能力是指容器组件尺寸发生变化时,增加或减小的空间全部分…

K 值选对,准确率翻倍:KNN 算法调参的黄金法则

目录 一、背景介绍 二、KNN 算法原理 2.1 核心思想 2.2 距离度量方法 2.3 算法流程 2.4算法结构: 三、KNN 算法代码实现 3.1 基于 Scikit-learn 的简单实现 3.2 手动实现 KNN(自定义代码) 四、K 值选择与可视化分析 4.1 K 值对分类…

Azure DevOps Server 2022.2 补丁(Patch 5)

微软Azure DevOps Server的产品组在4月8日发布了2022.2 的第5个补丁。下载路径为:https://aka.ms/devops2022.2patch5 这个补丁的主要功能是修改了代理(Agent)二进制安装文件的下载路径;之前,微软使用这个CND(域名为vstsagentpackage.azuree…

PHP7+MySQL5.6 查立得轻量级公交查询系统

# PHP7MySQL5.6 查立得轻量级公交查询系统 ## 系统简介 本系统是一个基于PHP7和MySQL5.6的轻量级公交查询系统(40KB级),支持线路查询、站点查询和换乘查询功能。系统采用原生PHPMySQL开发,无需第三方框架,适合手机端访问。 首发版本&#x…

Vue-Cropper:全面掌握图片裁剪组件

Vue-Cropper 完全学习指南:Vue图片裁剪组件 🎯 什么是 Vue-Cropper? Vue-Cropper 是一个简单易用的Vue图片裁剪组件,支持Vue2和Vue3。它提供了丰富的配置选项和回调方法,可以满足各种图片裁剪需求。 🌟 …

[Go] Option选项设计模式 — — 编程方式基础入门

[Go] Option选项设计模式 — — 编程方式基础入门 全部代码地址,欢迎⭐️ Github:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-option 1 介绍 在 Go 开发中,我们经常遇到需要处理多参数配置的场景。传统方…

【Unity开发】控制手机移动端的震动

🐾 个人主页 🐾 阿松爱睡觉,横竖醒不来 🏅你可以不屠龙,但不能不磨剑🗡 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…

Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)

🐧 Linux 软件安装方式全解(适用于 CentOS/RHEL 系统) 在 Linux 系统中,软件安装方式丰富多样,常见于以下几种方式: 安装方式命令/工具说明软件包管理器(推荐)yum, dnf, apt, zypp…

前端面试题-HTML篇

1. 请谈谈你对 Web 标准以及 W3C 的理解和认识。 我对 Web 标准 的理解是,它就像是互联网世界的“交通规则”,由 W3C(World Wide Web Consortium,万维网联盟) 这样一个国际性组织制定。这些规则规范了我们在编写 HTML、CSS 和 JavaScript 时应该遵循的语法和行为,比如要…

ERROR: column cl.udt_name does not exist LINE 1 navicat打开金仓表报错

描述: ERROR: column cl.udt_name does not exist LINE 1: …a.columns cl LEFT JOlN pg type ty ON ty.typname cl.udt nam. navicat连上金仓数据库之后,想打开一张表看看,每张表都报这个错,打不开 解决方案: 网上…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一: 定义其实坐标,右上角的元素(0,n-1)。进入while循环(注意边界条件,行数小于m,列数要>0)从右上角开始开始向左遍历(比当…

Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程

Jupyter MCP 服务器是基于模型上下文协议(Model Context Protocol, MCP)的 Jupyter 环境扩展组件,它能够实现大型语言模型与实时编码会话的无缝集成。该服务器通过标准化的协议接口,使 AI 模型能够安全地访问和操作 Jupyter 的核心…

MySQL下载安装配置环境变量

MySQL下载安装配置环境变量 文章目录 MySQL下载安装配置环境变量一、安装MySQL1.1 下载1.2 安装 二、查看MySQL服务是否启动三、配置环境变量四、验证 一、安装MySQL 1.1 下载 官网社区版(免费版):https://dev.mysql.com/downloads/mysql/ …

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?

在 WSL 的 Debian 12 系统中安装 curl 非常简单,你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤: 1. 更新软件包索引 首先确保系统的包索引是最新的: sudo apt update2. 安装 curl 执行以下命令安装 curl: sudo…

Linux入门(十四)rpmyum

RPM 是RedHat PackManager的缩写 rpm是用于互联网下载包的打包及安装工具 rpm查询 查询已安装的rpm列表 rpm -qa查看系统是否安装了psmisc rpm -qa | grep psmisc rpm -q psmisc查询软件包信息 rpm -qi psmisc查询软件包中的文件 rpm -ql psmisc根据文件全路径 查询文件所…

[git]忽略.gitignore文件

git rm --cached .gitignore 是一个 Git 命令,主要用于 从版本控制中移除已追踪的 .gitignore 文件,但保留该文件在本地工作目录中。以下是详细解析: 一、命令拆解与核心作用 语法解析 git rm:Git 的删除命令,用于从版本库(Repository)中移除文件。--cached:关键参数…

Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法

一、排序与分发相关 BY 关键字 1. ORDER BY:全局统一排序 作用:对查询结果进行全局排序,确保最终结果集完全有序(仅允许单个 Reducer 处理数据)。 语法: SELECT * FROM table_name ORDER BY column1 [A…