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…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...