首页 > 编程语言 >一个简单的C#程序解析

一个简单的C#程序解析

时间:2023-06-25 13:56:14浏览次数:39  
标签:类型转换 Console C# 程序 int 数组 类型 解析

一个简单的C#程序解析

using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
         /* 我的第一个 C# 程序*/
         Console.WriteLine("Hello World");
         Console.ReadKey();
      }
   }
}
  • 程序的第一行 using System; - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句。

  • 下一行是 namespace 声明。一个 namespace 里包含了一系列的类。HelloWorldApplication 命名空间包含了类 HelloWorld

  • 下一行是 class 声明。类 HelloWorld 包含了程序使用的数据和方法声明。类一般包含多个方法。方法定义了类的行为。在这里,HelloWorld 类只有一个 Main 方法。

  • 下一行定义了 Main 方法,是所有 C# 程序的 入口点Main 方法说明当执行时 类将做什么动作。

  • 下一行 /.../ 将会被编译器忽略,且它会在程序中添加额外的 注释

  • Main 方法通过语句Console.WriteLine("Hello World"); 指定了它的行为。

    WriteLine 是一个定义在 System 命名空间中的 Console 类的一个方法。该语句会在屏幕上显示消息 "Hello World"。

  • 最后一行 Console.ReadKey(); 是针对 VS.NET 用户的。这使得程序会等待一个按键的动作,防止程序从 Visual Studio .NET 启动时屏幕会快速运行并关闭。

C#基本语法

using关键字

在任何的C#程序中的第一条语句都是

using System;

一个程序可以包含多个using语句

class关键字

class关键字用于声明一个类

C#中的注释

单行注释//

//这是单行注释

多行注释/**/

/* 这是一个

多行注释 */

C#的数据类型

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)
指针类型

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

声明指针类型的语法:

type* identifier;

例如:

char* cptr;
int* iptr;

C#的类型转换

C# 中的类型转换可以分为两种:隐式转换和显式转换。

隐式类型转换

隐式转换是指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。

例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。将一个 byte 类型的变量赋值给 int 类型的变量,编译器会自动将 byte 类型转换为 int 类型,不需要显示转换。

byte b = 10;
int i = b; // 隐式转换,不需要显示转换
显示类型转换

显式类型转换,即强制类型转换。

显式转换是指将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型转换符号进行显示转换,强制转换会造成数据丢失。

例如,将一个 int 类型的变量赋值给 byte 类型的变量,需要显示转换。

int i = 10;
byte b = (byte)i; // 显式转换,需要使用强制类型转换符号

在进行类型转换时需要注意以下几点:

  • 隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型;
  • 显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查;
  • 对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查。

C#变量

C#中的变量定义
int i,j,k;
char c,ch;
float f;
double d;

也可以在变量定义时进行初始化

int i =100;

接受来自用户的值

System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中。

int num;
num = Convert.ToInt32(Console.ReadLine());

函数 Convert.ToInt32() 把用户输入的数据转换为 int 数据类型,因为 Console.ReadLine() 只接受字符串格式的数据。

C#常量

常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。

常量可以被当作常规的变量,只是它们的值在定义后不能被修改。

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制。

整数常量也可以有后缀,可以是 U 和 L 的组合,其中,U 和 L 分别表示 unsigned 和 long。后缀可以是大写或者小写,多个后缀以任意顺序进行组合。

定义常量

常量是使用 const 关键字来定义的 。

例:

const <data_type> <constant_name> = value;

C#运算符

特殊运算符
运算符 描述 实例
sizeof() 返回数据类型的大小。 sizeof(int),将返回 4.
typeof() 返回 class 的类型。 typeof(StreamReader);
& 返回变量的地址。 &a; 将得到变量的实际地址。
* 变量的指针。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则为 X : 否则为 Y
is 判断对象是否为某一类型。 If( Ford is Car) // 检查 Ford 是否是 Car 类的一个对象。
as 强制转换,即使转换失败也不会抛出异常。 Object obj = new StringReader("Hello"); StringReader r = obj as StringReader;

typeof 关键字用于获取一个类型的类型对象,它通常用于反射和动态创建类型实例。

例:

using System;

class Program
{
    static void Main(string[] args)
    {
        Type type = typeof(string);
        Console.WriteLine(type.FullName);
        Console.ReadKey();
    }
}

在上面的代码中,我们使用 typeof 关键字来获取 string 类型的类型对象,并将其存储在 Type 类型的变量 type 中,然后,我们使用 FullName 属性打印该类型的完全限定名。

执行结果:

System.String

C#封装

  • (1) Pubilc :任何公有成员可以被外部的类访问。
  • (2) Private :只有同一个类中的函数可以访问它的私有成员。
  • (3) Protected :该类内部和继承类中可以访问。
  • (4) internal : 同一个程序集的对象可以访问。
  • (5) Protected internal :3 和 4 的并集,符合任意一条都可以访问。

范围比较:

private < internal/protected < protected internal < public

C#方法调用

按引用传递参数

引用参数是一个对变量的内存位置的引用。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。

在C#中,使用ref关键字声明引用参数。

按输出传递参数

return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。

using System;

namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void getValue(out int x )
      {
         int temp = 5;
         x = temp;
      }
   
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         /* 局部变量定义 */
         int a = 100;
         
         Console.WriteLine("在方法调用之前,a 的值: {0}", a);
         
         /* 调用函数来获取值 */
         n.getValue(out a);

         Console.WriteLine("在方法调用之后,a 的值: {0}", a);
         Console.ReadLine();

      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

在方法调用之前,a 的值: 100
在方法调用之后,a 的值: 5

C#可空类型(Nullable)

C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。

例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值。类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null。

C#单问号和双问号

? 单问号用于对 int、double、bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable 类型的。

int i;//默认值0
int? i;//默认值null
double? num=new double?();

?? 双问号用于判断一个变量在为 null 的时候返回一个指定的值。

Null合并运算符(双问号??)

Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 Null。Null 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。

如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。

double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34;      //因为num1为空,则num3的值为5.34
num3 = num2 ?? 5.34;      //因为num2不为空,则num3的值为3.14157

C#数组

C#二维数组

声明一个二维数组:

string[,] names;

声明一个三维数组

int [ , , ] m;
C#交错数组

交错数组是数组的数组。交错数组是一维数组。

声明一个交错数组:

int [][] scores;

初始化一个交错数组:

int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
C#参数数组

有时,当声明一个方法时,您不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。

params关键字

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用格式为:

public 返回类型 方法名称( params 类型名称[] 数组名称 )

标签:类型转换,Console,C#,程序,int,数组,类型,解析
From: https://www.cnblogs.com/tongsuper/p/17502751.html

相关文章

  • Access denied for user 'root'@'121.28.69.73' (using password: YES)问题的解决
    问题描述发现是连接不上远程数据库,那就只能先转成本地运行了问题解决转成本地的相关步骤:好吧,耽误了大概一个小时的时间,就是远程连接失败,需要换成本地的;就是将数据库改成本地连接就行啦!......
  • java调用cmd命令
    importlombok.extern.slf4j.Slf4j;importorg.apache.commons.io.IOUtils;importjava.io.InputStream;importjava.nio.charset.StandardCharsets;importjava.util.AbstractMap;importjava.util.List;importjava.util.Map;importjava.util.concurrent.Completab......
  • Go常见错误集锦之混淆slice中的长度(length)和容量(capacity)
    原文文章:https://zhuanlan.zhihu.com/p/413972333 在Go语言中,slice的底层实现是数组,也就是说,切片的数据实际上是被存储在数组中的。如果后端的数组空间已经满了或是空数组,则slice结构体负责处理数组容量的扩容或缩容逻辑。此外,slice的结构体中共拥有三个字段:一个指针,指向后......
  • 锁(case篇)
    case1(表锁的读-写-读阻塞)上篇文档中提到过WRITElocksnormallyhavehigherprioritythanREADlockstoensurethatupdatesareprocessedassoonaspossible.ThismeansthatifonesessionobtainsaREADlockandthenanothersessionrequestsaWRITElock,su......
  • 实际案例分析 - 根据应用程序日志的记录,反查出哪一行 ABAP 代码产生的这条日志试读版
    本文的写作动机来自笔者知识星球一个朋友的提问:调用bapi创建主数据的时候报错,没有未物料组分配特性参数文件,这个是什么原因?实际查看,特性文件已经生成了这个朋友提供的是应用程序日志(即ApplicationLog)里的截图。关于应用程序日志的详细用法,笔者之前的文章已经做过介绍。74.学会......
  • 希望openkylin和银河麒麟支持直接硬盘启动liveCD安装
    希望openkylin和银河麒麟支持直接硬盘启动liveCD安装debian和ubuntu一直都支持直接用grub2/grub4dos从硬盘引导linux.iso整体启动,引导参数findiso和iso-scan/filename,这么多年了,银河麒麟的init一直不能直接从硬盘引导安装,希望改进!#grub2:menuentry"/linux2/debian/debian-live-11.......
  • docker 配置加速镜像
    配置文件daemon.json{"builder":{"gc":{"defaultKeepStorage":"20GB","enabled":true}},"experimental":false,"features":{"buildkit":true......
  • I Will Boast In Christ Lyric
    IWillBoastInChristLyric(Comeon,let'smakeyourselfapersontonight)AllIhavebecauseofJesusAllthispromiseWonformeWhenHepaidthehighestransomOnceforalwaysFormyfreedomIwillboastinChristaloneHisrighteousnessNotmyo......
  • 既然心里活着的还是那个年轻人,我们申请跟未来的“小程序员”们一起过个节...
    题图|pch.vector -www.freepik.com大儿童们,节日快乐!作为一个上世纪的人,每到这一天听到李老师这首歌,就难以控制的泪流成河,悲伤成海......也许我们从未成熟还没能晓得就快要老了尽管心里活着的还是那个年轻人因为不安而频频回首无知地索求羞耻于求救不知疲倦地翻越每一个山丘........
  • WebAssembly能不能取代JavaScript?15张卡通图给你答案!
    一切能用JavaScript实现的,终将用JavaScript实现。一切能编译为WebAssembly的,终将编译为WebAssembly。前端er们,WebAssembly用上了吗?在浏览器中快速运行非JavaScript语言,比如C、C++、Rust,是不是很香?今天,我们就来用15张小画图说WebAssembly。有必要先介绍一下小画的创作者。她叫LinCl......