C#入门(1):程序结构、数据类型
一、C#程序结构
第一个C#程序
using System;namespace base_01
{class Program{#region 代码折叠块static void Main(string[] args){//控制台输出Console.WriteLine("Hello World!");Console.Write("C#是微软的编程语言"); //不换行输出//Console.ReadKey(); //控制台等待,VS2017之后的高版本不需要这句}#endregion}
}
代码说明:
(1)每个程序只能有一个Main方法,且使用static修饰;
(2)#region 代码折叠块, #endregion可以实现代码块折叠;
(3)C#需要引用命名空间,类似于C++添加头文件,命名空间里有相关类。例如Console是System名字空间里的类;
(4)控制台输出:C#使用Console.WriteLine在控制台输出文本,它可以输出各种数据类型的值,包括 string
、int
、double
等。以下是一些常用的 Console.WriteLine
写法。
-
输出字符串:
Console.WriteLine("Hello, World!");
-
输出变量的值:
string name = "John"; Console.WriteLine(name); // Outputs "John"
-
使用占位符输出变量的值:
int age = 30; Console.WriteLine("I am {0} years old.", age); // Outputs "I am 30 years old."
在这个例子中,
{0}
是一个占位符,它会被age
变量的值替换。 -
输出多个变量的值:
string name = "John"; int age = 30; Console.WriteLine("My name is {0} and I am {1} years old.", name, age); // Outputs "My name is John and I am 30 years old."
-
输出数值:
Console.WriteLine(123); // Outputs "123" Console.WriteLine(123.45); // Outputs "123.45"
-
输出布尔值:
Console.WriteLine(true); // Outputs "True"
-
输出对象的字符串表示(通常是通过调用对象的
ToString()
方法得到的):DateTime now = DateTime.Now; Console.WriteLine(now); // Outputs the current date and time
-
$
输出符
C# 6.0 引入了一种新的字符串插值语法,允许在字符串中直接包含表达式。这种语法使用$
符号在字符串前面声明。表达式用{}
包围,并直接在字符串中插入。
以下是一些使用 $
进行字符串插值的例子:
string name = "John";
Console.WriteLine($"Hello, {name}!"); // Outputs "Hello, John!"int age = 30;
Console.WriteLine($"I am {age} years old."); // Outputs "I am 30 years old."double pi = Math.PI;
Console.WriteLine($"Pi is approximately {pi}."); // Outputs "Pi is approximately 3.14159265358979."DateTime now = DateTime.Now;
Console.WriteLine($"The current date and time is {now}."); // Outputs the current date and time
在这些例子中,{name}
、{age}
、{pi}
和 {now}
是表达式,它们会被它们的值替换。
此外,你还可以在 {}
中包含复杂的表达式,甚至是格式字符串:
double pi = Math.PI;
Console.WriteLine($"Pi to 2 decimal places is {pi:F2}."); // Outputs "Pi to 2 decimal places is 3.14."
在这个例子中,:F2
是一个格式字符串,它指示 pi
的值应该以固定点数(即小数)的形式显示,并且小数部分应该有两位。
总的来说,Console.WriteLine
是一个非常灵活的方法,可以用来输出各种类型的数据,并且支持多种格式的输出。
二、C#代码注释
(1)3个斜线然后回车可以注释方法。
(2)2个斜线普通注释
(3)/**/
多行注释
三、变量命名规则
在C#中,变量命名遵循一些基本规则和规范:
-
合法字符:变量名可以包含字母、数字和下划线。但是,变量名必须以字母或下划线开头,不能以数字开头。
-
区分大小写:C#是大小写敏感的编程语言,这意味着
myVariable
和MyVariable
在C#中会被视为两个不同的变量。 -
关键字:你不能使用C#的关键字(如
int
,double
,if
等)作为变量名。如果你想用关键字作为变量名,可以在关键字前加上@
符号,例如@int
。但一般来说,这并不是一个好的做法。 -
长度:理论上,变量名的长度没有限制,但是为了代码的清晰性,最好保持变量名在合理的长度。
-
有意义的名称:变量名应该描述它所存储数据的内容或用途。使用有意义的变量名可以提高代码的可读性。
除了这些基本规则之外,还有一些命名规范通常在C#编程中被遵循:
-
PascalCase:在C#中,常量和类型名(如类名和枚举名)通常遵循PascalCase命名规范,即每个单词的首字母大写,例如
MyClass
,MaxValue
。 -
camelCase:局部变量和方法参数通常遵循camelCase命名规范,即第一个单词的首字母小写,后续单词的首字母大写,例如
myVariable
,maxValue
。
这些规则和规范有助于保持代码的清晰性和一致性,尤其是在大型项目或团队工作中。
四、C# 数据类型
在C#中,数据类型被分为两种主要类型:值类型(Value types)和引用类型(Reference types)。这两种类型的主要区别在于它们存储和访问数据的方式。
值类型
值类型(Value types)直接包含数据。比如整数,浮点数,布尔值,字符和结构等。值类型的变量保存实际的数据值。当你把一个值类型的变量赋值给另一个值类型的变量时,实际上是复制了一份数据,两个变量可以独立变化,互不影响。
C#中的基本值类型有:
- 整型:
sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
- 浮点型:
float
,double
- 十进制类型:
decimal
- 布尔型:
bool
- 字符型:
char
- 结构型:
struct
,enum
示例代码
下面是一些示例代码:
int number = 10; // 整型
float rate = 4.5f; // 浮点型
bool flag = true; // 布尔型
char letter = 'A'; // 字符型
decimal price = 19.95m; // 十进制类型// 枚举(enum)
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };// 结构(struct)
struct Point
{public int X;public int Y;
}
enum用法
假设我们有一个表示一周中的天的枚举,并且我们在一个名为Schedule
的类中使用这个枚举。我们可以创建一个方法来输出今天是星期几:
public enum DayOfWeek
{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
}public class Schedule
{public DayOfWeek Day { get; set; }public void PrintDay(){Console.WriteLine($"Today is {Day}.");}
}
在上述代码中,Schedule
类有一个Day
属性,其类型为DayOfWeek
枚举。PrintDay
方法会输出Day
的值。
然后,你可以在Main
方法中创建一个Schedule
对象,并测试这个方法:
class Program
{static void Main(){Schedule schedule = new Schedule();schedule.Day = DayOfWeek.Monday;schedule.PrintDay(); // Outputs "Today is Monday."schedule.Day = DayOfWeek.Friday;schedule.PrintDay(); // Outputs "Today is Friday."}
}
在这个例子中,我们首先设置Day
为DayOfWeek.Monday
,然后调用PrintDay
方法,它会输出"Today is Monday.“。然后我们将Day
改为DayOfWeek.Friday
,并再次调用PrintDay
方法,它会输出"Today is Friday.”。
decimal用法
decimal
是C#中用于存储十进制数的数据类型。它是一种值类型,通常用于需要高精度的数值运算,比如财务计算和货币计算。decimal
类型的范围是±1.0 x 10^-28 至 ±7.9228 x 10^28。同时,它可以存储最多28位的小数,这比其他任何浮点数据类型都要精确。
创建并初始化一个 decimal
变量的语法如下:
decimal price = 19.95m;
注意,我们在数值后面添加了 m
或者 M
后缀,这是声明 decimal
类型变量的必要语法。
decimal
类型支持以下运算符: +
, -
, *
, /
, %
。以下是一些例子:
decimal price = 19.95m;
decimal discount = 0.15m; // 15% discount
decimal discountedPrice = price - (price * discount); // Calculate discounted price
decimal
类型也支持比较操作符,如 ==
, !=
, <
, >
, <=
, >=
。例如:
decimal price1 = 19.95m;
decimal price2 = 20.00m;if (price1 < price2)
{Console.WriteLine("price1 is less than price2.");
}
总的来说,decimal
类型是C#中最精确的数值类型,它非常适合用于需要精确计算的场合,尤其是在计算财务数据时。
引用类型
引用类型(Reference types)不直接包含数据;相反,它们包含对内存位置的引用,这个内存位置包含实际数据。这意味着当你把一个引用类型的变量赋值给另一个引用类型的变量时,实际上是复制了引用,两个变量指向同一个内存位置,改变其中一个变量会影响到另一个变量。
C#中的基本引用类型有:
- 类(Class)
- 接口(Interface)
- 委托(Delegate)
- 数组
下面是一些示例代码:
// 类(Class)
class MyClass
{public int Number;public string Name;
}// 接口(Interface)
interface IMyInterface
{void MyMethod();
}// 委托(Delegate)
delegate void MyDelegate(int x);// 数组
int[] numbers = new int[5];
这就是C#中的基本数据类型,值类型和引用类型的介绍和代码示例。
五、const与readonly
const用法
在C#中,const
关键字用于声明常量,即它的值在定义后不能更改。const
字段或局部变量必须在声明时赋值,而且值必须是编译时常量。
以下是一些使用const
声明常量的例子:
const int MyIntConstant = 10;
const double MyDoubleConstant = 3.14;
const string MyStringConstant = "Hello, World!";
在这些例子中,MyIntConstant
、MyDoubleConstant
和MyStringConstant
都被声明为常量,并在声明时被赋予值。这些值在后续的代码中不能被更改。
值得注意的是,const
关键字只能用于值类型(如int
、double
、bool
等)和字符串类型。对于引用类型(如类和数组),你不能使用const
,但可以使用readonly
关键字来创建其值不能更改的变量。
总的来说,const
关键字提供了一种方式来创建在编译时已知并且在程序运行时不会改变的值。这对于定义像数学常数(如π)或者固定的配置值等不会改变的值非常有用。
readonly
readonly
关键字用于声明在对象的生命周期内其值不会改变的字段。readonly
字段可以在声明时或在构造函数中初始化。readonly
可以应用于任何类型,包括用户定义的类和结构,也可以应用于数组(但是,虽然不能更改数组引用,但可以更改数组元素)。
例如:
public class MyClass
{public readonly int MyField;public MyClass(int value){MyField = value;}
}
在这个例子中,MyField
在构造函数中被初始化,然后在对象的生命周期内其值不会改变。
总结一下,const
和readonly
都用于创建不能更改的变量,但它们的主要区别在于:
const
变量的值必须在编译时就知道,而readonly
变量的值可以在运行时确定。const
只能用于值类型,枚举类型,string
或null
,而readonly
可以用于任何类型。const
变量总是静态的,而readonly
变量可以是静态的也可以是实例的。const
变量在定义后就不能更改,而readonly
变量可以在声明时或在构造函数中更改。
相关文章:

C#入门(1):程序结构、数据类型
一、C#程序结构 第一个C#程序 using System;namespace base_01 {class Program{#region 代码折叠块static void Main(string[] args){//控制台输出Console.WriteLine("Hello World!");Console.Write("C#是微软的编程语言"); //不换行输出//Console.Rea…...
Scala---元组
1、元组定义 与列表一样,与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的。 2、创建元组与取值 val tuple new Tuple(1) 可以使用newval tuple2 Tuple(1,2) 可以不使…...

【Linux】冯诺依曼体系结构、操作系统、进程概念、进程状态、环境变量、进程地址空间
目录 一、冯诺依曼体系结构二、操作系统(OS)1. 操作系统是什么2. 操作系统如何做管理3. 系统调用和库函数概念 三、进程1. 进程是什么?2. 描述进程-PCB3. 查看进程的方法 四、进程状态1 运行、阻塞和挂起状态2 Linux中的进程状态 五、进程优先级1. 什么是优先级2.查…...

【hive-解决】HiveAccessControlException Permission denied: CREATEFUNCTION
文章目录 一.任务描述二. 解决 一.任务描述 Error while compiling statement: FAILED: HiveAccessControlException Permission denied: Principal [nameroot, typeUSER] does not have following privileges for operation CREATEFUNCTION [ADMIN PRIVILEGE on INPUT, ADMIN…...

内网穿透的应用-通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境
文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…...

解决 uniapp 开发微信小程序 不能使用本地图片作为背景图 问题
参考博文:uniapp微信小程序无法使用本地静态资源图片(背景图在真机不显示)的解决方法_javascript技巧_脚本之家 问题:uniapp 开发微信小程序,当使用本地图片作为 background-image 时,真机无法显示 解决: 方法一&am…...
常用中间件封装思路粗记
MQ 自定义注解 ,编写配置类在bean属性初始化SmartInitializingSingleton#afterSingletonsInstantiated后至处理器 去扫描有自定义注解的bean,去创建对应消费者的容器 并启动消费者容器类主要组件DefaultMQPushConsumer SmartInitializingSingleton#afte…...

探索SPI:深入理解原理、源码与应用场景
文章目录 一、初步认识1、概念2、工作原理3、作用场景 二、源码分析1、ServiceLoader结构2、相关字段3、核心方法 三、案例connector连接器小案例1、新建SPI项目2、创建扩展实现项目1-MongoDB3、创建扩展实现项目2-Oracle4、测试 Spring应用1、创建study工程2、创建forlan-test…...
Web3名词解释
Web3名词解释 以太坊 ERC20 Defi去中心化金融 Defi是Decentralized Finance的英文缩写。 简单理解点就是与传统的高度中心化金融体系相比,去中心化金融是通过区块链技术,比如基于区块链技术开发的手机钱包软件,通过智能合约代码以实现去除…...

Vatee万腾外汇市场新力量:vatee科技决策力
在当今数字化时代,Vatee万腾崭露头角,以其强大的科技决策力进军外汇市场,成为该领域的新力量。这一新动向将不仅塑造外汇市场的未来,也展现Vatee科技决策力在金融领域的引领作用。 Vatee万腾带着先进的科技决策力进入外汇市场&…...

【HarmonyOS开发】配置开发工具DevEco Studio
1、下载 注意: 1、安装过程中,一定要自定义安装位置,包比较大,包比较大,包比较大!!! 2、可以将该工具添加到右键中,否则,如果你的项目不是HarmonyOSÿ…...

探索亚马逊大语言模型:开启人工智能时代的语言创作新篇章
文章目录 前言一、大语言模型是什么?应用范围 二、Amazon Bedrock总结 前言 想必大家在ChatGPT的突然兴起,大家多多少少都会有各种各样的问题,比如:大语言模型和生成式AI有什么关系呢?大语言模型为什么这么火…...

zabbix-proxy分布式监控
Zabbix是一款开源的企业级网络监控软件,可以监测服务器、网络设备、应用程序等各种资源的状态和性能指标。在大型环境中,如果只有一个Zabbix Server来监控所有的节点,可能会遇到性能瓶颈和数据处理难题。 为了解决这个问题,Zabbi…...
springboot生成PDF,并且添加水印
/*** 导出调查问卷*/ApiLog("导出调查问卷")PostMapping("/print/{id}")ApiOperationSupport(order 23)ApiOperation(value "导出报告", notes "导出报告")public void print(PathVariable Long id, HttpServletResponse response…...
Tensorflow2.0:CNN、ResNet实现MNIST分类识别
以下仅是个人的学习笔记 ,内容可能是错误 CNN: import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers# 导入数据 (x_train, y_train), (x_test, y_test) keras.datasets.mnist.load_data()# 数据预处理 x_tra…...

本地jar导入maven
一、通过dependency引入 1.1. jar包放置,建造lib目录 1.2. pom.xml文件 <dependency><groupId>zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version><!--system,类似provided&#x…...

数据结构与算法【堆】的Java实现
前言 之前已经说过堆的特点了,具体文章在数据结构与算法【队列】的Java实现-CSDN博客。因此直接实现堆的其他功能。 建堆 所谓建堆,就是将一个初始的堆变为大顶堆或是小顶堆。这里以大顶堆为例。展示如何建堆。 找到最后一个非叶子节点从后向前&…...

同创永益联合红帽打造一站式数字韧性解决方案
随着AI技术的快速兴起,IT技术已成为推动业务持续增长的重要驱动力,这要求企业不断尝试新事物,改变固有流程,加强IT技术与业务的合作,同时提升数字韧性能力,以实现业务目标。10月26日,红帽2023中…...
c++ call_once 使用详解
c call_once 使用详解 std::call_once 头文件 #include <mutex>。 函数原型: template<class Callable, class... Args> void call_once(std::once_flag& flag, Callable&& f, Args&&... args);flag:标志对象…...
【rosrun diagnostic_analysis】报错No module named rospkg | ubuntu 20.04
ubuntu20.04使用指令报错 现象 rosrun diagnostic_analysis export_csv.py my.bag -d ~/Desktop报错 Traceback (most recent call last): File "/opt/ros/noetic/lib/diagnostic_analysis/export_csv.py", line 40, in <module> import roslib; roslib.load_m…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...