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…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
