做网站怎么安装数据库,企业口碑推广,常熟网站,网站开发调研目录
C# 变量
C# 中的变量定义与初始化
接受来自用户的值
C# 中的 Lvalues 和 Rvalues
不同类型变量进行运算
静态变量
局部变量
C# 常量
整数常量
浮点常量
字符常量
字符串常量
定义常量
扩展知识
Convert.ToDouble 与 Double.Parse 的区别
静态常量和动态常…目录
C# 变量
C# 中的变量定义与初始化
接受来自用户的值
C# 中的 Lvalues 和 Rvalues
不同类型变量进行运算
静态变量
局部变量
C# 常量
整数常量
浮点常量
字符常量
字符串常量
定义常量
扩展知识
Convert.ToDouble 与 Double.Parse 的区别
静态常量和动态常量
关于常量变量命名的规则 C# 变量
在C#中每个变量都有特定的类型类型决定了变量的内存大小和布局以及可以对变量进行的操作。下面我将对C#中提供的这些基本的值类型进行简要的说明
整数类型C#中的整数类型包括sbyte、byte、short、ushort、int、uint、long、ulong和char。它们分别表示有符号字节、无符号字节、有符号短整型、无符号短整型、有符号整型、无符号整型、有符号长整型、无符号长整型和Unicode字符。浮点型C#中的浮点类型有float和double它们分别用于存储单精度浮点数和双精度浮点数。十进制类型C#中的十进制类型是decimal它用于精确表示小数通常用于金融等领域。布尔类型C#中的布尔类型是bool只能存储true或false值用于逻辑判断。空类型C#中引入了可空类型的概念通过在类型名称后加上?来定义可空类型的变量例如int?、bool?等这样的变量可以存储正常的数据也可以存储null值。
此外C#还允许定义其他值类型的变量比如enum枚举类型以及定义引用类型变量比如class类类型
C# 中的变量定义与初始化
在C#中定义变量需要指定变量的类型并为其分配一个合适的名称。变量定义的一般形式如下
type identifier; // 声明一个变量但不初始化
type identifier value; // 声明一个变量并初始化其中
type 表示变量的数据类型可以是整数类型、浮点型、字符型、布尔型等。identifier 是变量的名称用于在程序中引用该变量。value 是要赋给变量的初始值可以省略表示不进行初始化。
举例来说如果我们想声明一个整数类型的变量age可以这样做
int age; // 声明一个整数型变量age但不初始化如果要在声明时就给age变量赋一个初始值可以这样
int age 30; // 声明一个整数型变量age并赋初值30另外C#也支持在声明时使用var关键字进行隐式类型推断例如
var name John; // 根据赋值右侧的数据类型推断name为字符串类型需要注意的是变量名必须遵循标识符的命名规则首字母不能是数字不能使用C#的关键字作为变量名变量名区分大小写。
接受来自用户的值
在C#中可以使用Console.ReadLine()来接受来自用户的输入值。这个方法会等待用户在控制台中输入一行文本然后将用户输入的文本作为字符串返回。如果需要将用户输入的内容转换为其他类型比如整数、浮点数等可以使用相应类型的转换方法比如int.Parse()或者Convert.ToInt32()来实现可以看这篇文章学习。
下面是一个简单的示例演示如何接受用户的输入并将其转换为整数
using System;class Program
{static void Main(){Console.WriteLine(请输入您的年龄);string input Console.ReadLine(); // 接受用户输入的字符串int age 0;if (int.TryParse(input, out age)){Console.WriteLine(您的年龄是 age);}else{Console.WriteLine(输入的不是有效的年龄);}}
}在这个示例中我们首先使用Console.ReadLine()来接受用户输入的字符串并将其保存在input变量中。然后我们使用int.TryParse()方法将input字符串转换为整数类型并将转换后的值存储在age变量中。如果转换成功就输出用户的年龄如果转换失败就输出错误信息。
这样通过使用Console.ReadLine()和适当的类型转换方法就可以很方便地接受来自用户的输入值了。
C# 中的 Lvalues 和 Rvalues
在C#中表达式可以分为左值Lvalue和右值Rvalue。这两个术语通常用于描述赋值操作和表达式的值。 lvalue左值在 C# 中lvalue 是一个表示存储位置的表达式可以出现在赋值语句的左边或右边。换句话说lvalue 是一个可以被赋值的表达式。通常情况下变量就是 lvalue因为它们代表了内存中的存储位置。 rvalue右值在 C# 中rvalue 表达式是一个产生值的表达式可以出现在赋值语句的右边。rvalue 表达式计算出一个值但不能直接作为赋值语句的左值出现。
所以在 C# 中变量是 lvalue因此可以出现在赋值语句的左边而数值、常量、表达式等都是 rvalue只能出现在赋值语句的右边。
int a 5; // a 是 lvalue
int b 3; // b 是 lvalue
int c a b; // a b 是 rvalue计算出一个值用于赋给 c// 下面的语句将导致编译错误因为常量 2 是 rvalue不能作为赋值语句的左值
// 2 a;不同类型变量进行运算
double a 42.29;
int b 4229;
int c a b;
Console.WriteLine(c {0},c);
Console.ReadKey();
上面这种编程方法是错误的会出现错误提示 举例说明当一个精度高的数据类型与一个精度低的数据类型进行运算时定义运算结果的变量类型必须与精度最高的变量类型相同。这是为了防止在运算过程中造成数据丢失。
下面是正确代码
using System;class Program
{static void Main(){double a 42.29;int b 4229;double c a b;Console.WriteLine(c {0}, c); //输出c 4271.29Console.ReadKey();}
}静态变量
在C#中确实没有全局变量的概念所有的变量都必须属于某个类的实例或者是静态变量类级别的变量。这种设计有助于提高安全性和避免命名冲突但同时在某些情况下也会限制了对全局状态的管理。
正因如此静态变量就成为了一种在整个类中共享数据的方式。通过静态变量可以在类的所有实例之间共享相同的数据这在某些情况下非常有用比如跟踪全局状态、存储常量值或者单例模式的实现等。
举个例子如果有一个 Car 类我们希望能够跟踪所有汽车的数量那么就可以使用静态变量来实现
public class Car
{public static int numberOfCars 0;public Car(){numberOfCars;}
}在这个例子中numberOfCars 就是一个静态变量它跟踪着 Car 类的所有实例的数量。每次创建一个新的 Car 实例时numberOfCars 都会自动增加。这样的设计正是静态变量的优秀应用之一。
因此在一些特定的场景下静态变量能够有效地解决全局共享数据的需求同时也需要注意线程安全性和合理使用的问题。
局部变量
在C#中方法的局部变量必须在使用之前进行显式初始化。虽然不一定需要在声明变量的时候就进行初始化但在使用变量之前必须确保它已经被赋值。
这种要求是为了避免潜在的错误比如使用未初始化的变量从而导致不可预测的行为。编译器会通过方法检查所有可能的路径如果检测到局部变量在初始化之前就被使用就会产生编译错误以提示开发者存在潜在的问题。
举个例子以下代码将会产生编译错误
public void ExampleMethod()
{int x;Console.WriteLine(x); // 编译错误使用了未赋值的变量xx 10; // 只有在这里进行了赋值才能正确地使用x
}在这个例子中变量 x 在使用之前并没有进行初始化赋值因此会导致编译错误。为了修复这个问题我们应该在使用变量之前先对其进行赋值。
C# 常量
常量是固定值程序执行期间不会改变。常量可以是任何基本数据类型比如整数常量、浮点常量、字符常量或者字符串常量还有枚举常量。
常量可以被当作常规的变量只是它们的值在定义后不能被修改。
整数常量
在C#中整数常量可以使用不同的进制表示并且可以附加后缀来指定其类型。
1、十进制整数常量
十进制整数常量是最常见的可以直接使用数字表示例如
int decimalConst 123;
uint positiveDecimalConst 456U; // 使用后缀U表示无符号整数
long longDecimalConst 789L; // 使用后缀L表示长整数2、十六进制整数常量
十六进制整数常量以 0x 或 0X 开头后面跟着十六进制数字表示例如
int hexConst 0xABCD;
uint positiveHexConst 0x1234U; // 使用后缀U表示无符号整数3、八进制整数常量
八进制整数常量以 0 开头后面跟着八进制数字表示0-7例如
int octalConst 0123;4、整数常量后缀 整数常量可以附加后缀来指定类型例如
U 或 u 表示无符号整型L 或 l 表示长整型多个后缀可以以任意顺序进行组合例如 UL, Lu 等。
浮点常量
一个浮点常量是由整数部分、小数点、小数部分和指数部分组成。可以使用小数形式或者指数形式来表示浮点常量。以下是两种表示形式的示例
1、小数形式 浮点常量的小数形式由整数部分、小数点和小数部分组成例如
3.142.718123.456
2、指数形式 浮点常量的指数形式使用科学计数法表示由尾数部分和指数部分组成例如
6.022e23 相当于6.022乘以10的23次方1.602e-19 相当于1.602乘以10的负19次方
在C#中我们可以使用小数形式或者指数形式来表示浮点常量以满足不同数值范围和精度的需求。
字符常量
字符常量在C#中是以单引号括起来的例如 x并且可以存储在一个简单的字符类型变量中。字符常量可以是一个普通字符例如 x、一个转义序列例如 \t或者一个通用字符例如 \u02C0。
在 C# 中有一些特定的字符当它们的前面带有反斜杠时有特殊的意义可用于表示换行符\n或制表符 tab\t。在这里列出一些转义序列码
转义序列含义\\\ 字符\ 字符\ 字符\?? 字符\aAlert 或 bell\b退格键Backspace\f换页符Form feed\n换行符Newline\r回车\t水平制表符 tab\v垂直制表符 tab\ooo一到三位的八进制数\xhh . . .一个或多个数字的十六进制数
以下是一些转义序列字符的实例
using System;class Program
{static void Main(){// 定义一个普通字符常量char normalChar A;Console.WriteLine(normalChar); // 输出A// 使用转义序列表示制表符char tabChar \t;Console.WriteLine(Hello tabChar World); // 输出Hello World// 使用转义序列表示换行符char newLineChar \n;Console.WriteLine(第一行 newLineChar 第二行); // 输出// 第一行// 第二行// 使用八进制数表示特定的字符char octalChar \u0041; // 这里表示的是ASCII码为65的字符即AConsole.WriteLine(octalChar); // 输出A}
}字符串常量
在C#中字符串常量可以被包裹在双引号 中例如Hello, World!也可以使用符号作为前缀这样的字符串称为字符串例如Hello, World!。字符串通常用于包含换行符等特殊字符的情况因为在字符串中转义序列会被直接输出而不会被解释。
以下是一个示例演示了如何在C#中使用多行字符串常量
using System;class Program
{static void Main(){// 多行字符串常量string multiLineString This is a very long string that spans multiple lines but appears as a single string.;Console.WriteLine(multiLineString);// 使用 字符串来包含换行符等特殊字符string multiLineStringWithAtSign This is a multi-linestring using the symbolto include new lines directly.;Console.WriteLine(multiLineStringWithAtSign);}
}在上面的示例中第一个字符串常量跨越多行但通过在每行的末尾添加空格编译器将其连接成一个完整的字符串。第二个示例则使用字符串直接包含了换行符使得整个字符串的格式与源代码中的格式保持一致。
此外在C#中还有一个很重要的特性即可以通过将一个很长的行拆分成多个行来使用字符串常量。这种方式非常有助于提高代码的可读性特别是当需要定义很长的字符串时。这种做法可以通过在每一行的末尾使用空格来实现编译器会自动将它们连接在一起形成一个完整的字符串。
定义常量
在C#中可以使用关键字 const 来定义常量。常量是指在程序执行期间其值不会改变的变量一旦被赋值后就无法再次修改。常量在声明时必须进行初始化而且不能使用赋值语句来改变它们的值。
以下是一个简单的示例演示了如何在C#中定义常量
using System;class Program
{static void Main(){const int hoursInDay 24;const double pi 3.14159;const string greeting Hello, World!;Console.WriteLine(There are hoursInDay hours in a day.);Console.WriteLine(The value of pi is approximately pi .);Console.WriteLine(greeting);}
}在上面的示例中hoursInDay、pi 和 greeting 都被声明为常量并分别被赋予了初始值。在后续的代码中无法修改这些常量的值。当您尝试修改常量的值或者在声明后未给其赋值编译器会报错。
扩展知识
Convert.ToDouble 与 Double.Parse 的区别
实际上 Convert.ToDouble 与 Double.Parse 较为类似 Convert.ToDouble内部调用了 Double.Parse
(1)对于参数为null的时候
Convert.ToDouble参数为 null 时返回 0.0Double.Parse 参数为 null 时抛出异常。
(2)对于参数为的时候
Convert.ToDouble参数为 时抛出异常Double.Parse 参数为 时抛出异常。
(3)其它区别
Convert.ToDouble可以转换的类型较多Double.Parse 只能转换数字类型的字符串。Double.TryParse 与 Double.Parse 又较为类似但它不会产生异常转换成功返回 true转换失败返回 false。最后一个参数为输出值如果转换失败输出值为 0.0。
以下是一个附带测试的代码示例
using System;class Program
{static void Main(){// 1. 参数为null的情况double result1 Convert.ToDouble(null); // 返回 0.0//double result2 Double.Parse(null); // 抛出异常// 2. 参数为的情况//double result3 Convert.ToDouble(); // 抛出异常//double result4 Double.Parse(); // 抛出异常// 3. 其他区别string numberStr 3.14;double result5 Convert.ToDouble(numberStr); // 可以转换成功double result6 Double.Parse(numberStr); // 可以转换成功string nonNumberStr abc;//double result7 Convert.ToDouble(nonNumberStr); // 抛出异常//double result8 Double.Parse(nonNumberStr); // 抛出异常// 使用 Double.TryParsedouble result9;bool parseResult Double.TryParse(5.67, out result9); // 转换成功parseResult 为 trueresult9 的值为 5.67bool parseResult2 Double.TryParse(xyz, out result9); // 转换失败parseResult2 为 falseresult9 的值为 0.0Console.WriteLine(Convert.ToDouble(null): result1);Console.WriteLine(Double.TryParse result: parseResult);Console.WriteLine(Double.TryParse output value: result9);}
}静态常量和动态常量
在 C# 中常量const和只读字段readonly确实都用于表示不可更改的值但是它们之间有一些重要的区别
1、const静态常量编译时常量
const 关键字用于声明编译时常量即在编译时就确定了值并且在声明时必须进行初始化之后不能再更改。const 可以在类、结构体、枚举以及方法内部使用。声明方法const type name value;
public class MyClass
{public const double Pi 3.14; // 正确声明常量的方法// public const int b; // 错误必须进行初始化
}2、readonly动态常量运行时常量
readonly 关键字用于声明只读字段其值可以在声明时或构造函数中初始化并且只能在类中定义。它的值在运行时确定且无法被修改。readonly 字段可以在声明时或构造函数中初始化而在其他方法中则无法修改其值。声明方法readonly type name;
public class MyClass
{public readonly double Pi; // 声明只读字段public MyClass(){Pi 3.14; // 只能在构造函数中初始化}
}总结来说const 适用于在编译时已知且不会改变的常量值而 readonly 适用于在运行时确定且不可变的常量值。
需要注意的是在编程中对于取值永久不变且在编译时已知的常量比如圆周率、一天的小时数、地球的半径等使用 const 常量是非常合适的这样可以在编译时直接将常量的值嵌入到代码中从而避免了运行时的性能开销。
另外在对程序性能要求非常苛刻的情况下也可以考虑使用 const 常量因为它们的值在编译时就确定可以对程序的性能和内存占用进行优化。
而对于其他情况尤其是在需要在运行时确定常量值的情况下或者常量的赋值需要依赖于构造函数等复杂逻辑时使用 readonly 常量更为合适。这样可以保证常量的值在运行时确定并且可以在构造函数中进行初始化同时也更灵活地满足程序的需求。
关于常量变量命名的规则
对于带有 private 访问修饰符的常量下划线开头、骆驼命名法是一种常见的做法例如 _bookName。
而对于带有 public 或 protected 访问修饰符的常量则使用帕斯卡命名法首字母大写并且单词之间没有下划线例如 BookPrice。
public class Book
{// 使用帕斯卡命名法命名的公共常量public const string Title C# 编程; // 使用帕斯卡命名法命名的受保护常量protected const double Price 29.99;// 使用下划线和骆驼命名法命名的私有常量private const int _maxAllowed 5;
}在这个示例中我们根据访问修饰符来规范常量的命名方式。公共常量 Title 和受保护常量 Price 使用帕斯卡命名法而私有常量 _maxAllowed 则使用了下划线和骆驼命名法。